您的位置:首页 > 数据库

在论坛中出现的比较难的sql问题:17(字符分拆2)

2013-12-15 15:25 309 查看
最近,在论坛中,遇到了不少比较难的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 */

本文出自 “探索SQLServer” 博客,请务必保留此出处http://yupeigu.blog.51cto.com/3323001/1367953
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐