2010-04-06 2 views
5

쉼표로 구분 된 ID 목록을 변수로 전달하려는 저장 프로 시저를 만듭니다. 나는 select 문에 ID를 사용하려면, 무엇인가 : 나는 @Ids은 VARCHAR 아닌 INT라는 오류가 발생하지만 어떻게 쉼표로 구분 된 목록을 변환 할 수 있습니다 분명히IN (@Variable_CommaDelimitedListOfIDS)을 사용하여 SELECT 문을 사용하는 저장 프로 시저

Create Procedure up_TEST 
@Ids VARCHAR(MAX) 
AS 
SELECT * FROM ATable a 
WHERE a.Id IN(@Ids) 

?

나는 SQL 서버 2008

덕분에 내가 사용하는 경우에

답변

2

을 사용하고 있습니다 여러분은 여러분의 필요에 적응할 수있는이 테이블 기능 : 저장 프로 시저에서

CREATE FUNCTION dbo.f_params_to_list (@par VARCHAR(500)) 
returns @result TABLE (value VARCHAR(30)) 
AS 
begin 
    DECLARE @TempList table 
      (
      value VARCHAR(30) 
     ) 

    DECLARE @Value varchar(30), @Pos int 

    SET @par = LTRIM(RTRIM(@par))+ ',' 
    SET @Pos = CHARINDEX(',', @par, 1) 

    IF REPLACE(@par, ',', '') <> '' 
    BEGIN 
      WHILE @Pos > 0 
      BEGIN 
       SET @Value = LTRIM(RTRIM(LEFT(@par, @Pos - 1))) 
       IF @Value <> '' 
       BEGIN 
        INSERT INTO @TempList (value) VALUES (@Value) --Use Appropriate conversion 
       END 
       SET @par = RIGHT(@par, LEN(@par) - @Pos) 
       SET @Pos = CHARINDEX(',', @par, 1) 

      END 
    END  
    INSERT @result 
    SELECT value 
     FROM @TempList 
    RETURN 
END  

당신은 다음과 같이 사용합니다 :

Create Procedure up_TEST 
@Ids VARCHAR(MAX) 
AS 
SELECT * FROM ATable a 
WHERE a.Id IN(SELECT value FROM dbo.f_params_to_list(@Ids)) 
0

한 가지 방법 ... 분할과 tempory 테이블에와 절에서 사용 된 SQL보다 ID를 삽입 할 수

1

이 문제가 발생하는 경우 Sommarskog의 기사를 읽어야합니다.

http://www.sommarskog.se/index.html

내가 추천 :

  • 배열 및 목록을 SQL 서버에
  • 저주와 동적 SQL의 축복을.
4

SQL Server 2008을 사용하고 있으므로 table-valued parameters을 살펴보십시오.

+0

@TGnat, 멋진 사람, 팁 주셔서 감사합니다! +1 –

+0

+1 - 당신이 취할 수있는 다양한 기술 (CSV 대 테이블 값 매개 변수 대 XML)의 성능 비교를보고 싶다면 필자는 오래 전에 이것을 블로그에 올렸습니다. http://www.adathedev.co.uk /2010/02/sql-server-2008-table-valued-parameters.html – AdaTheDev

+1

@AdaTheDev, 링크를 기반으로 'CREATE TYPE CustomerIDTableType AS TABLE (ID INTEGER PRIMARY KEY)'과 같이 CustomerID에 대한 새 테이블 매개 변수 유형을 만드는 이유는 무엇입니까? ; 당신은 정수형리스트를 넘겨 주는데 이것을 사용한다. –

2

테이블 값 매개 변수 (SQl Server 2008의 새로운 기능)를 사용하십시오. 실제 테이블 매개 변수 유형을 생성하여 설정을 :

CREATE TYPE IntTableType AS TABLE (ID INTEGER PRIMARY KEY) 

귀하의 절차는 다음과 같다 :

Create Procedure up_TEST 
    @Ids IntTableType READONLY 
AS 

SELECT * 
    FROM ATable a 
    WHERE a.Id IN (SELECT ID FROM @Ids) 

RETURN 0 
GO 

당신은 테이블 값 매개 변수를 사용하여 볼 수없는 경우 : "Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters" by Erland Sommarskog을 한 후 여러 가지 방법이 있습니다 SQL Server에서 문자열을 분할합니다. 이 문서에서는 거의 모든 방법의 장단점을 설명합니다 : 당신은 분할 기능을 만들 필요가

"Arrays and Lists in SQL Server 2005 and Beyond, When Table Value Parameters Do Not Cut it" by Erland Sommarskog

. 이것은 분할 기능을 사용할 수있는 방법입니다 :

SELECT 
    * 
    FROM YourTable        y 
    INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value 

I prefer the number table approach to split a string in TSQL하지만, SQL 서버에서 문자열을 분할 각각의 장단점을 설명하고 이전 링크를 참조하는 방법에는 여러 가지가 있습니다.

SELECT TOP 10000 IDENTITY(int,1,1) AS Number 
    INTO Numbers 
    FROM sys.objects s1 
    CROSS JOIN sys.objects s2 
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number) 

[숫자 테이블이 설정되면 다음 번호 테이블 방법

는 1 만에 행을 포함하는 테이블 Numbers을 만듭니다이 한 번 테이블 설정을 할 필요가 작동합니다 이 분할 함수를 만들 : 이제 쉽게 테이블에 CSV 문자열을 분할 할 수 있습니다

CREATE FUNCTION [dbo].[FN_ListToTable] 
(
    @SplitOn char(1)  --REQUIRED, the character to split the @List string on 
    ,@List  varchar(8000)--REQUIRED, the list to split apart 
) 
RETURNS TABLE 
AS 
RETURN 
(

    ---------------- 
    --SINGLE QUERY-- --this will not return empty rows 
    ---------------- 
    SELECT 
     ListValue 
     FROM (SELECT 
        LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue 
        FROM (
          SELECT @SplitOn + @List + @SplitOn AS List2 
         ) AS dt 
         INNER JOIN Numbers n ON n.Number < LEN(dt.List2) 
        WHERE SUBSTRING(List2, number, 1) = @SplitOn 
      ) dt2 
     WHERE ListValue IS NOT NULL AND ListValue!='' 

); 
GO 

을 그것에 가입 :

Create Procedure up_TEST 
@Ids VARCHAR(MAX) 
AS 
SELECT * FROM ATable a 
WHERE a.Id IN (SELECT ListValue FROM dbo.FN_ListToTable(',',@Ids)) 
1

모두가 오늘이 무언가를하고있는 것처럼 보입니다!

http://www.sqlteam.com/article/parsing-csv-values-into-multiple-rows을보십시오. 이것은 숫자/집계 테이블에 결합하여 분할 항목을 포함하는 결과 집합을 제공하기 위해 구분 된 입력 변수를 처리하는 방법입니다 (어쨌든 데이터베이스에 포함시키는 것이 좋습니다. 아직 안 했어.) 이렇게하면 일반 결과에 따라 조인 할 수있는 간단한 결과 세트가 제공됩니다.

1
CREATE PROCEDURE PROCEDURENAME 
@Id Numeric(18,0) 
AS 
BEGIN 
    SELECT * FROM tableName 
    WHERE tableName.Id IN (@Id) 
END 
+0

welcome to stackoverflow. 나는 그 질문을 잘못 읽은 것 같아. 위의 것은 * multiple * id의 목록과 함께 작동하지 않을 것입니다 (이것은 이미 답변 된 오래된 질문이기도합니다 :). – Leigh