当我尝试触发存储过程时为什么会出错?

时间:2016-10-23 20:04:32

标签: sql-server stored-procedures table-valued-parameters

我使用的是SQL Server 2012。

我需要从Visual Studio将整数数组传递给我的存储过程。我需要在where子句中使用传递的数组。

为此,我创建了table valued parameter

CREATE TYPE IdArray AS TABLE 
(
     Id int
);

这是我的存储过程:

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

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

但我尝试触发存储过程并在执行过程窗口中传递值(某些整数),我收到此错误:

  

必须将参数编号2和后续参数作为'@name = value'传递。在使用'@name = value'形式后,所有后续参数必须以'@name = value'的形式传递。

更新

这是我如何调用存储过程:

DECLARE @return_value int

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

SELECT  'Return Value' = @return_value

知道我为什么会收到这个错误吗?我做错了什么?

1 个答案:

答案 0 :(得分: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是一张表。