나는 이것이 당신이 가지고있는 유일한 정보 인 경우이, 할 수 없다고 생각한다. 매개 변수 값 사이의 관계는 목록에서의 위치입니다. SQL에서 이러한 위치를 연관 시키거나 보존하는 옵션은 없습니다.
SQL 문을 만들 때 어떤 영향이 있습니까? 이 매개 변수화하는 방법의 예를 들어
SELECT * FROM Gecoserv
WHERE typeOfEcosystem = 'Freshwater' AND service = 'Habitat'
UNION
SELECT * FROM Gecoserv
WHERE typeOfEcosystem = 'Freshwater' AND service = 'Food'
UNION
...
을 this answer를 보라 : 당신은 코드의 목록을 반복하고 동적 SQL을 만들 수 있다면
,이 같은 솔루션에 올 수 있습니다.
대안 : 분할 문자열
당신의 가장 큰 문제는 자신의 목록에있는 매개 변수의 "계급"/ "위치"를 유지하는 것입니다. 목록을 문자열로 바꾸고 나누면됩니다.
나는 example of a splitting a string in sql을 사용했습니다.
DECLARE
@ecoSystems varchar(100) = 'Freshwater,Saltwater,Dunes',
@services varchar(100) = 'Habitat,Food,Recreation',
@separator char(1) = ','
SELECT
[g].[id],
[g].[typeOfEcoSystem],
[g].[service]
FROM [dbo].[Split](@separator, @ecoSystems) [e]
INNER JOIN [dbo].[Split](@separator, @services) [s]
ON [e].[position] = [s].[position]
INNER JOIN [Gecoserv] [g]
ON [e].[part] = [g].[typeOfEcoSystem]
AND [s].[part] = [g].[service]
ORDER BY [id] ASC
윌 시나리오에 대해이 작업 : (this Fiddle로 만든)
결과 쿼리는 다음과 같습니다?은 (답 : 예, 거의 ...)
그리고 마지막으로 모든 백업 스키마 또는 데이터베이스 제조업체없이 함수
DECLARE
@ecoSystems varchar(100) = 'Freshwater,Saltwater,Dunes',
@services varchar(100) = 'Habitat,Food,Recreation',
@separator char(1) = ',';
WITH [EcoSystemsAndServices]([posE], [startE], [endE], [posS], [startS], [endS])
AS
(
SELECT
1,
1,
CHARINDEX(@separator, @ecoSystems),
1,
1,
CHARINDEX(@separator, @services)
UNION ALL
SELECT
[posE] + 1,
[endE] + 1,
CHARINDEX(@separator, @ecoSystems, [endE] + 1),
[posS] + 1,
[endS] + 1,
CHARINDEX(@separator, @services, [endS] + 1)
FROM [EcoSystemsAndServices]
WHERE [endE] > 0
)
SELECT
[g].[id],
[g].[typeOfEcoSystem],
[g].[service]
FROM [Gecoserv] [g]
INNER JOIN [EcoSystemsAndServices] [ess]
ON [g].[typeOfEcoSystem] = SUBSTRING(@ecoSystems,
[startE],
CASE WHEN [endE] > 0 THEN [endE] - [startE] ELSE 100 END)
AND [g].[service] = SUBSTRING(@services,
[startS],
CASE WHEN [endS] > 0 THEN [endS] - [startS] ELSE 100 END)
ORDER BY [id] ASC
이 테이블이 고유 키 (또는 다른 식별 열)이 있습니까 : 또한 기술 (그냥 평범한 오래된 신 읽기)에서 찾을 수 있습니까? – wildplasser