我确定答案是否,但是我还是要问专家;)
我已经在存储过程中声明了一个表变量。
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 才能完成上述任务)。但是我想问这个问题,希望我可能错过了一些东西。
非常感谢您的帮助。
谢谢
答案 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;