【问题标题】:Why do I get errors when I try to fire stored procedure?为什么我在尝试触发存储过程时会出错?
【发布时间】:2016-10-23 20:04:31
【问题描述】:

我使用 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

知道为什么会出现此错误吗?我做错了什么?

【问题讨论】:

  • 如果您希望我们指出您做错了什么,请发布您用于执行 proc 的代码。此外,不要使用sp_ 作为存储过程名称前缀。这表示 SQL Server 系统存储过程。请勿将 TVP 包含在引号中。相反,请指定一个子查询,如 SELECT id FROM @List
  • Where Clients.Id IN ( '@List' ) 也不会做你想做的事。你已经在这里得到了正确的语法stackoverflow.com/questions/40206849/…
  • 你能得到执行程序windows产生的代码吗?执行过程窗口使用@name = value 语法来调用 SP。如果您只是以逗号分隔的方式(1、2、3)编写数字,那么很可能会将其解释为 @List = 1, 2 ,3,这不是您想要的。
  • @DanGuzman,我的存储过程中有多个表值类型声明,我需要实现多个 where 过滤器。我尝试的是:ALTER PROCEDURE [dbo].[SP_TEST_TLP] @List dbo.IdArray READONLY, @List2 dbo.IdArray READONLY AS BEGIN SET NOCOUNT ON; select * from Clients Where Clients.Id IN (select id from @List) and (select id from @List2) END 但这是错误的。我该如何实现它?
  • @Michael,两个子查询都必须使用 IN 关键字引入。试试WHERE Clients.Id IN (SELECT id FROM @List) AND Clients.Id IN (SELECT id FROM @List2)

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


【解决方案1】:

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 是一个表格。

【讨论】:

  • 谢谢。您知道如何从 Visual Studio 传递 int 数组来填充表值参数吗?
  • @Michael,传递一个 System.Data.SqlDbType.Structured 类型的参数。该值可以是DataTableDataRow[]IEnumerable<SqlDataRecord>。包含整数列表的 DataTable 可能是最简单的。
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2021-10-08
相关资源
最近更新 更多