您的位置:首页 > 数据库

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐