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

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

WBOY
WBOYOriginal
2016-06-07 15:22:301314browse

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 1、存储过程 表A: aid bid status 1 1 0 1 2 0 2 1 0

最近,在论坛中,遇到了不少比较难的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
*/
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn