TSQL дефиниране на временна таблица (или променлива на таблица) без дефиниране на схема?

Има ли начин да се дефинира временна таблица, без да се дефинира нейната схема отпред?


person Jeff    schedule 27.03.2009    source източник


Отговори (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 

Обърнете внимание на начина, по който вмъквате в тази временна таблица.

Недостатъкът на това е, че може да отнеме малко повече време за писане, тъй като трябва да дефинирате променливата на вашата таблица.

Също така бих препоръчал SQL Prompt за Query Analyzer от RedGate.

person ElHaix    schedule 29.01.2010
comment
Променливата на таблицата обаче трябва да бъде дефинирана по време на компилиране, а не по време на изпълнение, нали? За това имах нужда от динамично генерирана таблица. - person Jeff; 31.01.2010
comment
Уф, но това е толкова многословно, особено след като TSQL няма оператор Insert-or-update... - person BlueRaja - Danny Pflughoeft; 22.02.2012
comment
@BlueRaja-DannyPflughoeft - можете да използвате командата MERGE, за да получите поведение „вмъкване или актуализиране“. msdn.microsoft.com/en-us/library/bb522522.aspx - person James Manning; 07.09.2012
comment
Идеята, че променливите на таблицата са по-бързи, защото са само в паметта, изглежда неправилна. Според тази променливи на таблицата с често задавани въпроси на Microsoft могат да се съхраняват в tempdb, тъй като потенциално биха могли да бъдат по-големи от паметта, която може да побере. Неговият въпрос/отговор #4. - person Trajanus; 31.10.2012
comment
Не само че не отговаря на въпроса, но е погрешно кога и защо да се използват променливи на таблицата. От гледна точка на скоростта, зависи от това как ще го направите и колко голям ще бъде той. Няма статистика. Не можете да създавате вторични индекси. Не можете да го промените. Също така няма връщане назад. А обхватът е много ограничен. Което води и до някои от неговите предимства. - person Gerard ONeill; 27.08.2013
comment
Променливата на таблицата не се регистрира. Ето защо определено е по-бързо за малки количества данни. - person Patrick Honorez; 24.01.2014
comment
Моля, актуализирайте отговора, за да премахнете грешната информация за променливите на таблицата, въведени в паметта. Обърнете се към този отговор за точна информация относно променливите на таблицата спрямо временните таблици. - person Jacob Stamm; 22.01.2020

нямате нужда от OPENQUERY. Просто поставете „INTO #AnyTableName“ между списъка за избор и FROM на всяка заявка...

SELECT *
    INTO #Temp1
    FROM table1
    WHERE x=y
person KM.    schedule 27.03.2009
comment
или Изберете * в #Temp1 от таблица1, където 0 = 1 - person Chris Burgess; 31.03.2009
comment
Не забравяйте да направите drop table #Temp1 в края на вашата процедура, ако използвате този метод - person Matthieu; 22.07.2015

Да, можете да го създадете с

SELECT INTO ...

Да речем

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