포럼 에서 발생 하 는 비교적 어 려 운 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 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
*/

좋은 웹페이지 즐겨찾기