문제

다음과 같은 쿼리를 실행하고 싶습니다.

 SELECT * FROM Studio WHERE Id IN (134, 144, 132, 138, 7432, 7543, 2566)

하지만 그 양은 IDIN 절에 전달된 의 내용은 런타임에만 결정됩니다.

동적 SQL을 사용해야 합니까, 아니면 저장 프로시저를 사용하여 수행할 수 있습니까?

업데이트:두 옵션 중 하나를 사용할 수 있는 경우 어느 것이 더 좋나요?

감사해요.

도움이 되었습니까?

해결책

SQL Server 버전에 따라 두 가지 방법 중 하나로 이 작업을 수행할 수 있습니다.

Sql 2000/2005의 경우 구분된 ID 목록이 있는 매개변수(varchar 유형)를 사용할 수 있습니다.varchar를 구문 분석하고 항목이 포함된 테이블을 반환하는 UDF를 만듭니다.그런 다음 IN 절을 테이블과 반대되게 만듭니다(예:...IN(@ReturnTable에서 ID 선택)).

UDF 내용의 예는 다음과 같습니다.http://pietschsoft.com/post/2006/02/03/T-SQL-Parse-a-delimited-string.aspx

Sql 2008의 경우에도 동일한 작업을 수행할 수 있습니다.그러나 varchar 매개변수를 전달하는 대신 추적을 잘라내어 Table 매개변수를 전달할 수 있습니다.IN 절에는 여전히 하위 쿼리가 있지만 모두 동일하게 작동합니다.또는 테이블이 있으면 해당 테이블에 대해 내부 조인을 수행하고 IN 절이 필요하지 않게 할 수 있습니다.

편집하다:구분된 문자열 링크를 구문 분석하기 위해 UDF를 추가했습니다.

다른 팁

여기에 설명 된 솔루션 :

SQL Server 2005의 배열 및 목록

Erland Sommarskog, SQL Server MVP의 SQL 텍스트

http://www.sommarskog.se/arrays-in-sql-2005.html

저장된 절차에서 절대적 으로이 작업을 수행 할 수 있습니다.

저장된 절차 내부에 온도 테이블을 만들고 쉼표 또는 구분기에 분할 값을 삽입 한 다음이 작업을 수행하십시오.

SELECT * FROM Studio WHERE Id IN (select id from temptable)

그런 다음 테이블을 삭제하십시오.

MSSQL 2000 이후로 내가 사용했던 UDF는 다음과 같습니다. 나는 이것을 어딘가에서 찾았습니다 - 죄송합니다. 어디서 기억할 수 없습니다.

기본적으로 UDF에서 조인을 할 수 있습니다. 여기서 첫 번째 매개 변수는 구분 된 문자열이고 두 번째 매개 변수는 구분 기자입니다.

t1.id = t2 on t2 on t2 on t1 on t2 on t2 on t2에서 t1 내부 조인 dbo.split (@delimitedvar, ') t2에서 t1.somecolumn을 선택하십시오.

CREATE FUNCTION [dbo].[Split]
(
@vcDelimitedString varchar(max),
@vcDelimiter varchar(100)
)
RETURNS @tblArray TABLE
   (
    ElementID smallint  IDENTITY(1,1), --Array index
    Element varchar(1000) --Array element contents
   )
AS
BEGIN
    DECLARE @siIndex smallint, @siStart smallint, @siDelSize smallint
    SET @siDelSize  = LEN(@vcDelimiter)
    --loop through source string and add elements to destination table array
    WHILE LEN(@vcDelimitedString) > 0
    BEGIN
        SET @siIndex = CHARINDEX(@vcDelimiter, @vcDelimitedString)
        IF @siIndex = 0
        BEGIN
            INSERT INTO @tblArray VALUES(@vcDelimitedString)
            BREAK
        END
        ELSE
        BEGIN
            INSERT INTO @tblArray VALUES(SUBSTRING(@vcDelimitedString, 1,@siIndex - 1))
            SET @siStart = @siIndex + @siDelSize
            SET @vcDelimitedString = SUBSTRING(@vcDelimitedString, @siStart , LEN(@vcDelimitedString) - @siStart + 1)
        END
    END
    RETURN
END

SQL 2008에서는 사용할 수 있습니다 테이블 값 매개 변수.

SQL 2005에서는 목록을 XML로 전달하고 절차에서 XML 처리를 사용하여 XML을 테이블 변수로 다시 파쇄하지 않는 한 동적 SQL을 사용해야합니다.

@temp 테이블을 선언하고 값을 분할하십시오. 그럼 당신은 할 수 있습니다

s.id = tb.id에서 @temptable tb join @temptable tb에서 *에서 *를 선택하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top