Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 为什么要使用表变量?_Sql Server 2008 - Fatal编程技术网

Sql server 2008 为什么要使用表变量?

Sql server 2008 为什么要使用表变量?,sql-server-2008,Sql Server 2008,我有以下现有SQL。我想重写它,不使用table变量。但我对这一点还不太了解,无法写一篇替换文章。在我看来,仅仅插入一张表就太复杂了 Create PROCEDURE [dbo].[InsertOrderHeader](@OrderHeader [OrderHeaderTable] READONLY) AS BEGIN declare @FullOrderHeaderTable TABLE ( OrderId int, UpdatedTime DateTime); INSERT INTO [O

我有以下现有SQL。我想重写它,不使用table变量。但我对这一点还不太了解,无法写一篇替换文章。在我看来,仅仅插入一张表就太复杂了

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
有没有更好的方法不用table变量来写这个


Greg

检索插入的数据

选项一

使用带有
表变量的
OUTPUT子句
,这是最简单的方法。你已经在做了

选项二

使用带有
临时表的
输出子句
,这是插入大量数据并希望检索插入的数据并对新插入的数据执行某些操作时的方法

使用Temp Tables over Table Variable有一个优点,即可以在其上创建索引并加快操作。正如我前面提到的,只有在你做一些大的插入和处理大量数据时,才建议你这样做


另一方面,不能在表变量上创建索引

检索插入的数据

选项一

使用带有
表变量的
OUTPUT子句
,这是最简单的方法。你已经在做了

选项二

使用带有
临时表的
输出子句
,这是插入大量数据并希望检索插入的数据并对新插入的数据执行某些操作时的方法

使用Temp Tables over Table Variable有一个优点,即可以在其上创建索引并加快操作。正如我前面提到的,只有在你做一些大的插入和处理大量数据时,才建议你这样做


另一方面,不能在表变量上创建索引

如果您所做的只是选择这些列,那么可以按如下方式重新编写,而不必首先使用表变量:

INSERT INTO [OrderHeader] 
OUTPUT Inserted.OrderId, Inserted.UpdatedTime
SELECT CustomerId, OrderLines, OrderStatus, ... other columns
FROM @OrderHeader;
但让我们澄清一些误解:

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

  • 不相关:。

    如果您所做的只是选择这些列,那么可以按照如下方式重新编写,而不首先使用表变量:

    INSERT INTO [OrderHeader] 
    OUTPUT Inserted.OrderId, Inserted.UpdatedTime
    SELECT CustomerId, OrderLines, OrderStatus, ... other columns
    FROM @OrderHeader;
    
    但让我们澄清一些误解:

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

  • 不相关:.

    如果临时数据库没有被过度使用,并且这个临时表不是太大,我会使用会话临时表(#FullOrderHeaderTable)。它是一个
    table
    类型的变量,用于获取插入的数据。实现这一点最方便的方法是,为什么你认为这是一个复杂的操作??@sam为什么你认为这与表变量有什么不同?及时的博客帖子:因为如果我需要向表中添加字段,这意味着要将其添加到UDTT,而要做到这一点,需要删除使用它的SP,更改UDTT,然后重新创建它。仅仅添加一个字段似乎需要做很多工作。那么,您接下来要如何处理table变量的结果呢?这似乎是收集从多行插入生成的所有标识值(假设OrderID是标识列)的最方便的方法如果没有过度使用temp db,并且该temp表格也不太大,则它是一个类型为
    table
    的变量,用于获取插入的数据。实现这一点最方便的方法是,为什么你认为这是一个复杂的操作??@sam为什么你认为这与表变量有什么不同?及时的博客帖子:因为如果我需要向表中添加字段,这意味着要将其添加到UDTT,而要做到这一点,需要删除使用它的SP,更改UDTT,然后重新创建它。仅仅添加一个字段似乎需要做很多工作。那么,您接下来要如何处理table变量的结果呢?这似乎是收集多行插入生成的所有标识值的最方便的方法(假设OrderID是标识列)。*注意,您可以在SQL Server 2014中为表变量创建索引(但您仍然无法从统计数据中获益)。您好@AaronBertrand迟来的圣诞快乐和新年快乐:),甚至不知道SQL Server 2014的存在。另一方面,临时表上的索引与普通表上的索引相似。嗯,它还在测试阶段,但这是一个广为宣传的增强。不确定您的索引问题是什么。*注意,您可以在SQL Server 2014中为表变量创建索引(但您仍然无法从统计数据中获益)。您好@AaronBertrand迟来的圣诞快乐和新年快乐:),甚至不知道SQL Server