最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。



1、存储过程

表A:
aid bid status
1    1   0
1    2   0
2    1   0
1    111  0
11   11   0

每条数据aid 联合bid 是唯一的,如何写存储过程进行批量操作。

传入[{aid:1,bid:2},{aid:11,bid:11}]
查询出下表数据:

aid bid status
1   2   0
11  11  0


建表语句:

CREATE TABLE A (aid      INT,  bid      INT,  statuss  INT  )  INSERT A  SELECT 1,1,0 UNION ALL SELECT 1,2,0 UNION ALL             SELECT 2,1,0 UNION ALL SELECT 1,111,0 UNION ALL SELECT 11,11,0 go 

--1.字符串分拆函数 if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')    drop function dbo.f_splitSTR go  create function dbo.f_splitSTR ( 	@s varchar(8000),     --要分拆的字符串 	@split varchar(10)    --分隔字符 )  returns @re table(                      --要返回的临时表                      col varchar(1000)  --临时表中的列                   ) as begin      declare @len int      set @len = LEN(@split)      --分隔符不一定就是一个字符,可能是2个字符      while CHARINDEX(@split,@s) >0   begin 	insert into @re  	values(left(@s,charindex(@split,@s) - 1)) 	 	set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'')    --覆盖:字符串以及分隔符   end      insert into @re values(@s)      return   --返回临时表 end go       CREATE PROC dbo.Pro_A @param varchar(100) AS   declare @str varchar(100) declare @sql nvarchar(4000)  set @str = '' set @sql = ''  if OBJECT_ID('tempdb..#temp') is not null    drop table #temp   --把拆分后的字段,插入到临时表 select LEFT(col,charindex(',',col)-1) as aid,        SUBSTRING(col,charindex(',',col)+1,LEN(col)) as bid        into #temp from dbo.f_splitSTR(@param,';') t   --生成动态语句 set @sql = 'SELECT *              FROM A             WHERE exists(select 1 from #temp                           where #temp.aid = a.aid and #temp.bid = a.bid)'  exec(@sql) go   exec Pro_A '1,2;11,11' /* aid	bid	statuss 1	2	0 11	11	0 */ 

另一种方法:

if object_id('dbo.Pro_A') is not null    drop proc Pro_A go  create PROC dbo.Pro_A @param varchar(100) AS   declare @str varchar(100) declare @sql nvarchar(4000)  set @str = @param set @sql = ''  set @str = replace(replace(replace(replace(REPLACE(@str,'[',''),']',''),'},{',';'),                    '{',''),'}','')               set @str = 'select '+replace(replace(@str,';',' union select '),':','=')   if OBJECT_ID('tempdb..#temp') is not null    drop table #temp  CREATE TABLE #temp (aid      INT,  bid      INT)   --把数据插入到临时表中 insert into #temp(aid,bid) exec(@str)   --生成动态语句 set @sql = 'SELECT *              FROM A             WHERE exists(select 1 from #temp                           where #temp.aid = a.aid and #temp.bid = a.bid)'  exec(@sql)  --print @str go   exec Pro_A '[{aid:1,bid:2},{aid:11,bid:11}]' /* aid	bid	statuss 1	2	0 11	11	0 */