我有以下现有的SQL。我想重写这个不使用表变量。但我不太了解这一点,以便写一个替代品。我只是插入表格似乎过于复杂。
Create PROCEDURE [dbo].[InsertOrderHeader](@OrderHeader [OrderHeaderTable] READONLY)
AS
BEGIN
declare @FullOrderHeaderTable TABLE ( OrderId int, UpdatedTime DateTime);
INSERT INTO [OrderHeader]
OUTPUT Inserted.OrderId, Inserted.UpdatedTime INTO @FullOrderHeaderTable
SELECT
CustomerId,
OrderLines,
OrderStatus,
NotificationType,
NotifyEmail,
NotifySMS,
PromoCode,
ReportTotal,
DiscountAmount,
OrderTotal,
GetDate(),
CreatedBy,
GetDate(),
UpdatedBy
FROM @OrderHeader
SELECT OrderId, UpdatedTime FROM @FullOrderHeaderTable;
END
有没有更好的方法来编写它而不使用表变量?
格雷格
答案 0 :(得分:5)
如果你所做的只是选择那些列,那么可以按如下方式重写,首先没有表变量:
INSERT INTO [OrderHeader]
OUTPUT Inserted.OrderId, Inserted.UpdatedTime
SELECT CustomerId, OrderLines, OrderStatus, ... other columns
FROM @OrderHeader;
但是,让我们澄清一些误解:
DECLARE @x TABLE
不是UDDT - 它只是一个表变量。@OrderHeader
表变量中删除或重命名这些列时才会中断,或者更改OrderHeader
表以便插入失败)。无关:please get in the habit of specifying the schema when referencing objects。
答案 1 :(得分:0)
检索插入的数据。
选项一
将OUTPUT clause
与Table Variable
一起使用,这是最简单的方法。你已经在做了。
选项二
将OUTPUT clause
与Temporary Table
一起使用,这是插入大量数据并想要检索插入的数据并对新插入的数据执行某些操作时的方法。
在表变量上使用临时表有一个优点,您可以在它上创建索引并加快操作。就像我之前提到的那样,只是建议你做一些大插入并处理大量数据。
另一方面,无法在表变量上创建索引。