SQL将一行多列数据合并成 一列

由于最近在做项目的时候,要对数据库中一行很多列个数据进行求和,便在网上查了一下,首先要用到动态SQL语句,动态sql感觉就是类似于拼接sql字符串

动态语句基本语法

1 :普通SQL语句可以用exec执行

Select * from tableName
exec(‘select * from tableName’)
exec sp_executesql N’select * from tableName’ — 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

declare @fname nvarchar(20)
set @fname = ‘FiledName’
Select @fname from tableName — 错误,不会提示错误,但结果为固定值FiledName,并非所要。
exec(‘select ‘ + @fname + ‘ from tableName’) —

请注意 加号前后的 单引号的边上加空格

如果设置字符串变量,应该把它设置成
nvarchar,
但是我在SQL SERVER2014上面用varchar照样也可以
接下来就是具体的执行代码
select 列1+列2+…+列30 from table
declare @sql nvarchar(1000)
set @sql=”
select @sql=@sql+’+isnull(‘+name+’,0)’–inull(paras1,paras2)函数用来判断是否为空,如果为空用paras2替换
from syscolumns 
where id=object_id(‘表名’) and xtype=56  –56表示整型 

set @sql=stuff(@sql,1,1,”)–用于将第一加号替换掉,这一句代码不可以少否则会出现错误
print (‘select ‘+@sql+’ from 表名’)
exec (‘select ‘+@sql+’ from 表名’)

《SQL将一行多列数据合并成 一列》
例如如上面的一张表格我要对其进行求和:
use test
go
declare @sql varchar(1000)
set @sql=”
select @sql=@sql+’+isnull(‘+name+’,0)’
from syscolumns
where id=object_id(‘tb1’) and xtype=56–对应整型

set @sql=stuff(@sql,1,1,”)
print (‘select ‘+@sql+’ from tb1′)

exec (‘select ‘+@sql+’ from tb1′)
《SQL将一行多列数据合并成 一列》
上面就是求得的结果,因为我把id和id1这两列设成了整型和浮点型所只计算了第一列
如果只想求一行的和可以在select 语句里加上TOP 函数,就可以了
如果我们想把执行动态SQL 的结果赋值给另一变量的话,就需要执行存储过程了,在执行下面的存储过程的时候如果是字符串类型的话应该都设置为nvarchar 这样可以避免出错
EXEC sp_executesql

   @stmt= <statement>,类似存储过程主体

@params = <params>, 类似存储过程参数部分,声明参数类型

<params assignment> 类似存储过程调用,为参数赋值,参数值要和参数顺序要一一对应,也可以通过为参数指明参数值的方式为其赋值
附上我写的代码:
declare @sum int,@sql nvarchar(1000),@num int,@sql1 nvarchar(100)

set @sql=”

select @sql=@sql+’+isnull(‘+name+’,0)’

from syscolumns

where id=object_id(‘tb1’) and xtype=56

set @sql=stuff(@sql,1,1,”)

–print (‘select ‘+@sql+’ from 表名’)

set @sql1=   ‘select @sum=(select top(1) id from tb1)’

set @sql1=’select @sum=(select top 1 ‘+@sql+’ id from tb1)’

exec sp_executesql @sql1,N’@sum int output’,@num output

select @num




PS: syscolumns是sqlserver中的一个系统表,用来记录sqlserver中字段信息的。也就是在数据库里所有表格里 的字段的信息
但是创建的临时表里的字段的信息并没有存储在这个系统表里


xtype    类型
34 image
35 text
36 uniqueidentifier
48 tinyint
52 smallint
56 int
58 smalldatetime
59 real
60 money
61 datetime
62 float
98 sql_variant
99 ntext
104 bit
106 decimal
108 numeric
122 smallmoney
127 bigint
165 varbinary
167 varchar
173 binary
175 char
189 timestamp
231 sysname
231 nvarchar
239 nchar

    原文作者:Master_Yoda
    原文地址: https://blog.csdn.net/dream_follower/article/details/52248731
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞