将声明表变量传递给另一个存储过程

时间:2018-11-23 07:48:16

标签: sql sql-server stored-procedures

我确定答案是,但是我还是要问专家;)

我已经在存储过程中声明了一个表变量。

DECLARE @OrderMapIds TABLE
(
    OrderId INT NOT NULL,
    NewOrderId INT NOT NULL
);
INSERT INTO @OrderMapIds (OrderId, NewOrderId)
SELECT [OrderId], [OrderId] FROM [tblOrder]
...
...
...
EXEC [AS.uspOrder_MoveOrder] @OrderMapIds = @OrderMapIds;  --I need to move order ids based on the mapped id

我需要将@OrderMapIds传递给[AS.uspOrder_MoveOrder]。问题是如何?

CREATE PROCEDURE [AS.uspOrderItem_CopyRecord]
(
    @OrderMapIds AS TABLE -- This thrown error
)
AS
BEGIN
    ...
    ...
    ...
END;

现在,我可以使用表值参数( TVP 完成此问题。但是,如果我不用TVP就可以通过它,那会更好(因此我不必为小东西创建TVP)。

现在,在查看Google之后,我确定答案是(即,我需要创建 TVP 才能完成上述任务)。但是我想问这个问题,希望我可能错过了一些东西。

非常感谢您的帮助。

谢谢

2 个答案:

答案 0 :(得分:2)

您是正确的。答案确实是。

在SQL Server中,将表传递给存储过程的唯一方法是使用用户定义的表类型。

不过,您在术语方面确实有些困惑。
TVP 本身就是参数-因此,即使您可以将任何表变量传递给存储过程,它也仍然是表值参数

您要避免(但不能)的是用户定义表类型

如果允许这样做,您将最终得到一个存储过程,该存储过程将采用具有未知结构的表值参数-这可能会导致错误,极其繁琐的代码,甚至更糟糕的是-静默地使用错误的数据。

答案 1 :(得分:2)

一个有趣的替代方法,尤其是当表结构是可变/相关的时,将数据转换为JSON / XML(参数的数据类型为NVARCHAR)。

在您的示例中可以采用的方式是

DECLARE @OrderMapIds NVARCHAR(MAX)=
(
    SELECT [OrderId], [OrderId] FROM [tblOrder] FOR JSON PATH

);
...
...
...
EXEC [AS.uspOrder_MoveOrder] @OrderMapIds = @OrderMapIds; 
相关问题