Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 TSQL在不定义模式的情况下定义临时表(或表变量)?_Sql Server_Tsql_Schema_Temp Tables_Table Variable - Fatal编程技术网

Sql server TSQL在不定义模式的情况下定义临时表(或表变量)?

Sql server TSQL在不定义模式的情况下定义临时表(或表变量)?,sql-server,tsql,schema,temp-tables,table-variable,Sql Server,Tsql,Schema,Temp Tables,Table Variable,有没有一种方法可以定义临时表而不预先定义其模式?是的,您可以使用 SELECT INTO ... 比方说 SELECT * INTO #t FROM OPENQUERY( 'server', 'exec database.dbo.proc_name value1, value2, ... ' ) 您不需要OPENQUERY。只需在选择列表和任何查询的FROM之间放入AnyTableName SELECT * INTO #Temp1 FROM table1 WHERE

有没有一种方法可以定义临时表而不预先定义其模式?

是的,您可以使用

SELECT INTO ...
比方说

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

您不需要OPENQUERY。只需在选择列表和任何查询的FROM之间放入AnyTableName

SELECT *
    INTO #Temp1
    FROM table1
    WHERE x=y

实际上,使用一个表变量,一个内存中的表,是最好的方法。该表在temp db中创建一个表,该表是全局的,都有磁盘命中。考虑事务数量的下降/命中。

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提示符。

或从表1中选择*into Temp1,其中0=1如果使用此方法,请不要忘记在过程结束时删除表Temp1。但是,表变量必须在编译时定义,而不是在运行时定义,对吗?为此,我需要一个动态生成的表。呃,但这太冗长了,特别是因为TSQL没有Insert或update语句…@BlueRaja DannyPflughoeft-您可以使用MERGE命令获得“Insert或update”行为。表变量之所以更快,是因为它们只在内存中,这种想法似乎是不正确的。根据Microsoft常见问题解答,表变量可以存储在tempdb中,因为它们可能比内存容量大。它的问题/答案4.不仅没有回答这个问题,而且在何时何地使用表变量上也有错误。就速度而言,这取决于您将如何查询它,以及它的大小。没有统计数字。不能创建辅助索引。你不能改变它。也没有回滚。而且范围非常有限。这也带来了它的一些优势。