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

时间:2021-09-09 15:05:05

由于最近在做项目的时候,要对数据库中一行很多列个数据进行求和,便在网上查了一下,首先要用到动态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