【问题标题】:TSQL Define Temp Table (or table variable) Without Defining Schema?TSQL 定义临时表(或表变量)而不定义模式?
【发布时间】:2010-10-15 20:26:36
【问题描述】:

有没有一种方法可以在不预先定义其架构的情况下定义临时表?

【问题讨论】:

    标签: sql-server tsql schema temp-tables table-variable


    【解决方案1】:

    是的,您可以使用

    创建它
    SELECT INTO ...
    

    我们说

    SELECT * INTO #t
    FROM OPENQUERY( 'server',
    'exec database.dbo.proc_name value1, value2, ... ' )
    

    【讨论】:

      【解决方案2】:

      您不需要 OPENQUERY。只需将“INTO #AnyTableName”放在选择列表和任何查询的 FROM 之间...

      SELECT *
          INTO #Temp1
          FROM table1
          WHERE x=y
      

      【讨论】:

      • 或 Select * into #Temp1 from table1 where 0 = 1
      • 如果您使用此方法,请不要忘记在程序结束时执行drop table #Temp1
      【解决方案3】:

      实际上使用表 VARIABLE(内存中的表)是最佳方式。 #table 在 temp db 中创建一个表,并且 ##table 是全局的 - 两者都有磁盘命中。考虑一下交易数量的放缓/打击。

      CREATE PROCEDURE [dbo].[GetAccounts] 
          @AccountID BIGINT,
          @Result INT OUT,
          @ErrorMessage VARCHAR(255) OUT
      AS
      BEGIN
          SET NOCOUNT ON;
          SET @Result = 0
          SET @ErrorMessage = ''
      
          DECLARE @tmp_Accounts TABLE (
                                                      AccountId BIGINT,
      AccountName VARCHAR(50),
      ...
      )
      
      INSERT INTO @tmp_Accounts ([AccountId], [AccountName]...
      )
      SELECT AccountID, AccountName
      FROM Accounts
      WHERE  ...
      
      
          IF @@Rowcount = 0
              BEGIN
                  SET @ErrorMessage = 'No accounts found.'
                  SET @Result = 0
      
                  RETURN @Result
              END
          ELSE
              BEGIN
                  SET @Result = 1
      
                  SELECT *
                  FROM @tmp_Accounts
              END 
      

      注意您插入此临时表的方式。

      这样做的缺点是可能需要更长的时间来编写,因为您必须定义表变量。

      我还推荐 RedGate 的 SQL Prompt for Query Analyzer。

      【讨论】:

      • 但是,表变量必须在编译时而不是运行时定义,对吗?为此,我需要一个动态生成的表格。
      • 呃,但这太冗长了,特别是因为 TSQL 没有“插入或更新”语句......
      • @BlueRaja-DannyPflughoeft - 您可以使用 MERGE 命令获取“插入或更新”行为。 msdn.microsoft.com/en-us/library/bb522522.aspx
      • 表变量更快因为它们只在内存中的想法似乎是不正确的。根据this Microsoft FAQ 表变量可以存储在 tempdb 中,因为它们可能比内存可以容纳的更大。它的问题/答案#4。
      • 不仅没有回答问题,而且在何时以及为什么使用表变量上错了。 Speedwise,这取决于您将如何查询它,以及它将有多大。没有统计数据。您不能创建二级索引。你不能改变它。也没有回滚。而且范围非常有限。这也带来了它的一些优势。
      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多