Heim > Datenbank > MySQL-Tutorial > 在论坛中出现的比较难的sql问题:17(字符分拆2)

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

WBOY
Freigeben: 2016-06-07 15:22:30
Original
1353 Leute haben es durchsucht

最近,在论坛中,遇到了不少比较难的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
Nach dem Login kopieren
--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
*/
Nach dem Login kopieren

另一种方法:
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
*/
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage