当前位置:  开发笔记 > 编程语言 > 正文

TSQL定义临时表(或表变量)而不定义架构?

如何解决《TSQL定义临时表(或表变量)而不定义架构?》经验,为你挑选了3个好方法。

有没有办法定义临时表而不预先定义它的架构?



1> ElHaix..:

实际上使用表VARIABLE(内存表)是最佳选择.#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.


表变量更快,因为它们仅在内存中的想法似乎是不正确的.根据[this](http://support.microsoft.com/default.aspx?scid=kb;en-us;305977&Product=sql2k),Microsoft FAQ表变量可以存储在tempdb中,因为它们可能比内存更大保持.问题/答案#4.
不仅没有回答这个问题,而且在何时以及为何使用表变量时出错了.Speedwise,*它取决于你将如何查询它,以及它将有多大.没有统计数据.您无法创建二级索引.你无法改变它.也没有回滚.范围非常有限.这也带来了一些优势.

2> KM...:

你不需要OPENQUERY.只需在选择列表和任何查询的FROM之间放入"INTO #AnyTableName"...

SELECT *
    INTO #Temp1
    FROM table1
    WHERE x=y


如果使用此方法,请不要忘记在程序结束时执行`drop table#Temp1`

3> boj..:

是的,你可以创建它

SELECT INTO ...

让我们说吧

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

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有