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 表名')
例如如上面的一张表格我要对其进行求和:
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')
上面就是求得的结果,因为我把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

发布了299 篇原创文章 · 获赞 95 · 访问量 48万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览