TSQL Define Temp Table (или табличная переменная) без определения схемы? - PullRequest
39 голосов
/ 27 марта 2009

Есть ли способ определить временную таблицу без предварительного определения ее схемы?

Ответы [ 3 ]

40 голосов
/ 29 января 2010

На самом деле использование таблицы VARIABLE, таблицы в памяти, является оптимальным способом. #Table создает таблицу в 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 

Обратите внимание на способ вставки в эту временную таблицу.

Недостатком этого является то, что запись может занять немного больше времени, так как вам нужно определить переменную таблицы.

Я бы также рекомендовал SQL Prompt для Query Analyzer от RedGate.

29 голосов
/ 28 марта 2009

вам не нужно OPENQUERY. Просто поместите «INTO #AnyTableName» между списком выбора и ОТ любого запроса ...

SELECT *
    INTO #Temp1
    FROM table1
    WHERE x=y
10 голосов
/ 27 марта 2009

Да, вы можете создать его с помощью

SELECT INTO ...

Допустим,

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