在论坛中出现的比较难的sql问题:17(字符分拆2)
最近,在论坛中,遇到了不少比较难的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*/
>更多相关文章
- 06-16卡巴斯基郑启良:支持信创发展是卡巴斯基的重要使命
- 06-16访问管理是确保现代工作场所安全的的五个关键原因
- 06-16零信任安全的演变:彻底改变网络安全策略
- 06-16GitHub上值得关注的20个网络安全项目
- 06-16英国曼彻斯特大学遭遇网络攻击,机密数据或遭窃!
- 06-16调查表明广告软件推送恶意软件感染了六万多个安卓应用程序
- 06-16微软向美国政府提供GPT的大模型,安全性如何保证?
- 06-16如何保护OT环境免受安全威胁?
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御