포럼 에서 발생 하 는 비교적 어 려 운 sql 문제: 17 (문자 분할 2)
그래서 기록 할 필요 가 있다 고 생각 합 니 다. 그러면 나중에 이런 문제 에 다시 부 딪 히 면 그 중에서 해답 의 방향 을 얻 을 수 있 습 니 다.
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
*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.