为什么这使用表变量?

时间:2014-01-02 19:41:14

标签: sql-server-2008

我有以下现有的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

有没有更好的方法来编写它而不使用表变量?

格雷格

2 个答案:

答案 0 :(得分:5)

如果你所做的只是选择那些列,那么可以按如下方式重写,首先没有表变量:

INSERT INTO [OrderHeader] 
OUTPUT Inserted.OrderId, Inserted.UpdatedTime
SELECT CustomerId, OrderLines, OrderStatus, ... other columns
FROM @OrderHeader;

但是,让我们澄清一些误解:

  1. DECLARE @x TABLE不是UDDT - 它只是一个表变量。
  2. 不推荐使用UDDT - 只使用名称UDDT(感谢CLR)。这些用户定义的数据类型现在正式称为别名类型
  3. 即使您继续使用表变量方法,如果基础表发生更改,也不需要更改 - 毕竟,它只捕获ID列和日期。您可以向表中添加其他50个列,此代码不会中断(只有在@OrderHeader表变量中删除或重命名这些列时才会中断,或者更改OrderHeader表以便插入失败)。
  4. 无关:please get in the habit of specifying the schema when referencing objects

答案 1 :(得分:0)

检索插入的数据。

选项一

OUTPUT clauseTable Variable一起使用,这是最简单的方法。你已经在做了。

选项二

OUTPUT clauseTemporary Table一起使用,这是插入大量数据并想要检索插入的数据并对新插入的数据执行某些操作时的方法。

在表变量上使用临时表有一个优点,您可以在它上创建索引并加快操作。就像我之前提到的那样,只是建议你做一些大插入并处理大量数据。

另一方面,无法在表变量上创建索引。