最近写存储过程时遇到一些拼接的问题,自己研究了下,把一些常遇见的问题总结如下:
1。存储过程怎样用sql拼接?
代码
alter PROCEDURE GetStudent
@StuNo nvarchar(15),
@StuName nvarchar(15)
AS
BEGIN
-- 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
--顺序必须一致。
END
GO
本人建议用这种方式去执行拼接的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%'
上面用到的'%'',''',''%'分别解析为%',','%