SQL拼接

来源:互联网 发布:企业社保报盘软件 编辑:程序博客网 时间:2024/06/11 05:05

最近写存储过程时遇到一些拼接的问题,自己研究了下,把一些常遇见的问题总结如下:

1。存储过程怎样用sql拼接?

代码 alter PROCEDURE GetStudent @StuNo nvarchar(15), @StuName nvarchar(15)ASBEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. declare @sql nvarchar(4000)    set @sql=N'select * from Student where StuName=@StuName and StuNo=@StuNo';  print(@sql)    exec sp_executesql      @sql,  N'  @StuNo nvarchar(15),  @StuName nvarchar(15)  ',   @StuNo,  @StuName--顺序必须一致。ENDGO    
本人建议用这种方式去执行拼接的sql语句。因为这样可以减少参数的拼接。
PS: N 代表存入数据库时以 Unicode 格式存储。

2. 怎样对存储过程传入参数,分割字符串获取数组

declare @string varchar(1000)
set @string='aaaa,bbbb,cccc,dddd'
declare @like varchar(20)='a,b';
set @string='select * into ##tmp from (select '''+replace(@string,',','''as str union all select ''')+''') as a' 
print(@string)
exec(@string)
set @string='select * from ##tmp where str like ''%'+REPLACE(@like,',','%'' or str like ''%')+'%'' '
print(@string)
exec(@string)
drop table ##tmp
一、SQL Replace函数
select replace('1,2,3',',',''',''')


result: 1','2','3


我们来分析一下结果:replace函数是将1,2,3中的逗号(,)替换成了',',也就是最终的结果为1','2','3
可是明明replace函数中写的替换字符串为''','''
''','''是怎样解析为','的呢?


首先说明一下:Sql中是没有双引号的,只有单引号。SQL中只支持单引号,表示字符串常量,是字符串的边界符;
SQL 的转义字符是:'(单引号)。


第一个和最后一个'表示边界符。
所以上面的sql语句完全可以写成select replace('1,2,3', ',' , ' '','' ')
然后分析边界符中间部分'',''
这个就很显然了,第一个和倒数第二个都是转义用的。
所以''','''最终解析为','


二、SQL拼接之将字符串分解为数组。
declare @string nvarchar(1000)
declare @sql nvarchar(1000)
set @string='a,b,c'
set @sql=' select * into ##tmp from (select ''' +replace(@string,',', ''' as str union all select ''')+''') as table_a'
print(@sql)
exec(@sql)
select * from ##tmp


解析后的sql语句为
select * into ##tmp from(
selct 'a' as str union all
selct 'b' as str union all
selct 'c' as str union all) as table_a


三、SQL拼接之like拼接


declare @like nvarchar(20)='a,b';
set @sql=' select * from ##tmp where str like ''%'+replace(@like,',', '%'' or str like ''%')+'%'' '


print(@sql)
exec(@sql)
drop table ##tmp


解析后的sql语句为
select * from ##tmp where str like '%a%' or str like '%b%'


上面用到的'%'',''',''%'分别解析为%',','%