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

浏览:
字体:
发布时间:2013-12-17 09:37:10
来源:

最近,在论坛中,遇到了不少比较难的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 ALLSELECT 1,2,0 UNION ALL            SELECT 2,1,0 UNION ALLSELECT 1,111,0 UNION ALLSELECT 11,11,0go
--1.字符串分拆函数if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')   drop function dbo.f_splitSTRgocreate function dbo.f_splitSTR(	@s varchar(8000),     --要分拆的字符串	@split varchar(10)    --分隔字符) returns @re table(                      --要返回的临时表                     col varchar(1000)  --临时表中的列                  )asbegin     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   --返回临时表endgo  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 #tempfrom 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)goexec Pro_A '1,2;11,11'/*aid	bid	statuss1	2	011	11	0*/

另一种方法:
if object_id('dbo.Pro_A') is not null   drop proc Pro_Agocreate PROC dbo.Pro_A@param varchar(100)AS declare @str varchar(100)declare @sql nvarchar(4000)set @str = @paramset @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 #tempCREATE 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 @strgoexec Pro_A '[{aid:1,bid:2},{aid:11,bid:11}]'/*aid	bid	statuss1	2	011	11	0*/
>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();