2016-10-23 4 views
-1

SQL Server 2012를 사용합니다.저장 프로 시저를 실행하려고하면 오류가 발생하는 이유는 무엇입니까?

Visual Studio에서 저장 프로 시저에 정수 배열을 전달해야합니다. 난 where 절에 전달 된 배열을 사용해야합니다. 여기

CREATE TYPE IdArray AS TABLE 
(
    Id int 
); 

그리고 내 저장 프로 시저 : 나는 table valued parameter을 만들어이를 위해

ALTER PROCEDURE [dbo].[SP_TEST_TLP] 
    @List dbo.IdArray READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * 
    FROM Clients 
    WHERE Clients.Id IN ('@List') 
END 

하지만 절차 창을 실행 저장 프로 시저 및 통과 값 (일부 정수)를 해고하려고 이 오류가 발생합니다.

Must pass parameter number 2 and subsequent parameters as '@name = value'. After the form '@name = value' has been used, all subsequent parameters must be passed in the form '@name = value'.

업데이트 :이 오류가 왜

DECLARE @return_value int 

EXEC @return_value = [dbo].[SP_TEST_TLP] 
     @List = 1,6 

SELECT 'Return Value' = @return_value 

어떤 생각 : 여기 스토어드 프로 시저를 호출하는 방법을

? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+1

우리가 잘못하고있는 것을 지적하고 싶다면, proc을 실행하기 위해 사용하고있는 코드를 게시하십시오. 또한 저장 프로 시저 이름 접두어로 'sp_'을 사용하지 마십시오. SQL Server 시스템 저장 프로 시저를 나타냅니다. TVP는 동봉하지 마십시오. 대신'SELECT id FROM @ List'와 같은 부질의를 지정하십시오. –

+0

'여기서 Clients.Id IN ('@List')'는 원하는 것을 수행하지 않습니다. 이미 올바른 구문을 사용하고 있습니다. http://stackoverflow.com/questions/40206849/why-i-get-error-when-i-try-to-create-stored-procedure –

+0

절차를 실행하는 코드를 얻을 수 있습니까? 창문이 생기니? 프로 시저 창은 @name = value 구문을 사용하여 SP를 호출합니다. 쉼표로 분리 된 숫자 (1, 2, 3)로 숫자를 쓰는 경우 대부분은 아마도'@List = 1, 2, 3'로 해석 될 것이고 그것은 당신이 원하는 것이 아닙니다. – infiniteRefactor

답변

2

TSQL의 테이블 값 형식 및 매개 변수는 사용자가 생각한 것과 약간 다릅니다.

테이블 값 매개 변수는 기본적으로 테이블이며 배열이나 목록은 아닙니다. 쉼표로 구분 된 구문을 사용하여 여러 값을 지정할 수 없습니다.

당신은 내가 당신이 절차를 인터페이스를 저장 실행합니다 이 할 수없는 것 같아요

DECLARE @return_value int 
DECLARE @MyList AS dbo.IdArray 

INSERT INTO @MyList (Id) 
VALUES (1),(6) 

EXEC @return_value = [dbo].[SP_TEST_TLP] @List = @MyList 

SELECT 'Return Value' = @return_value 

처럼해야한다.

그리고 저장 프로 시저 본문에서 테이블 이름을 사용하는 것처럼 @List을 사용해야합니다. ... IN ('$List')... 구조가 작동하지 않습니다. 조인 또는 하위 쿼리를 사용해야합니다. 기억하십시오. @List이 테이블입니다.

+0

감사합니다. 당신은 Visual Studio에서 정수 배열을 전달하여 테이블 값 매개 변수를 채우는 방법을 알고 있습니까? – Michael

+0

@Michael, System.Data.SqlDbType.Structured 유형의 매개 변수를 전달하십시오. 값은'DataTable','DataRow []'또는'IEnumerable '일 수 있습니다. 정수 목록을 포함하는 DataTable이 아마도 가장 쉽습니다. –

관련 문제