在论坛中出现的比较难的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
建表语句:
另一种方法:
本文出自 “探索SQLServer” 博客,请务必保留此出处http://yupeigu.blog.51cto.com/3323001/1367953
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
相关文章推荐
- 在论坛中出现的比较难的sql问题:17(字符分拆2)
- 在论坛中出现的比较难的sql问题:11(字符分拆1)
- 在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)
- 在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题)
- 在论坛中出现的比较难的sql问题:1(字符串分拆+行转列问题 SQL遍历截取字符串)
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
- 在论坛中出现的比较难的sql问题:18(字符合并1)
- 在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几)
- 在论坛中出现的比较难的sql问题:31(row_number函数+子查询 月环比计算)
- 在论坛中出现的比较难的sql问题:22(触发器专题3)
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
- 在论坛中出现的比较难的sql问题:15(行转列2)
- 在论坛中出现的比较难的sql问题:6(行转列问题)
- 在论坛中出现的比较难的sql问题:35(时间间隔计算问题)
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
- 在论坛中出现的比较难的sql问题:22(触发器专题3)
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
- 在论坛中出现的比较难的sql问题:3(row_number函数1)
- 在论坛中出现的比较难的sql问题:15(生成动态删除列语句 分组内多行转为多列)
- 在论坛中出现的比较难的sql问题:6(动态行转列 考试科目、排名动态列问题)