SQL拼接

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

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%'


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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值