为什么在我尝试启动存储过程时会出现错误?
Why do I get errors when I try to fire stored procedure?
我使用 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
但是我尝试在执行过程 window 中触发存储过程并传递值(一些整数),我得到这个错误:
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
知道为什么会出现此错误吗?我做错了什么?
Table TSQL 中的值类型和参数与您想象的略有不同。
Table 值参数基本上是 tables,而不是数组或列表。您不能使用逗号分隔的语法来指定多个值。
你应该这样做
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
我猜你不能用执行存储过程接口来做这个。
并且在存储过程主体中,您应该像使用任何 table 名称一样使用 @List
。您的 ... IN ( '$List' )...
构造将不起作用。您需要使用连接或子查询。请记住,@List
是 table.
我使用 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
但是我尝试在执行过程 window 中触发存储过程并传递值(一些整数),我得到这个错误:
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
知道为什么会出现此错误吗?我做错了什么?
Table TSQL 中的值类型和参数与您想象的略有不同。
Table 值参数基本上是 tables,而不是数组或列表。您不能使用逗号分隔的语法来指定多个值。
你应该这样做
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
我猜你不能用执行存储过程接口来做这个。
并且在存储过程主体中,您应该像使用任何 table 名称一样使用 @List
。您的 ... IN ( '$List' )...
构造将不起作用。您需要使用连接或子查询。请记住,@List
是 table.