Има ли начин да се дефинира временна таблица, без да се дефинира нейната схема отпред?
TSQL дефиниране на временна таблица (или променлива на таблица) без дефиниране на схема?
Отговори (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
Променливата на таблицата обаче трябва да бъде дефинирана по време на компилиране, а не по време на изпълнение, нали? За това имах нужда от динамично генерирана таблица.
- person Jeff; 31.01.2010
Уф, но това е толкова многословно, особено след като TSQL няма оператор Insert-or-update...
- person BlueRaja - Danny Pflughoeft; 22.02.2012
@BlueRaja-DannyPflughoeft - можете да използвате командата MERGE, за да получите поведение „вмъкване или актуализиране“. msdn.microsoft.com/en-us/library/bb522522.aspx
- person James Manning; 07.09.2012
Идеята, че променливите на таблицата са по-бързи, защото са само в паметта, изглежда неправилна. Според тази променливи на таблицата с често задавани въпроси на Microsoft могат да се съхраняват в tempdb, тъй като потенциално биха могли да бъдат по-големи от паметта, която може да побере. Неговият въпрос/отговор #4.
- person Trajanus; 31.10.2012
Не само че не отговаря на въпроса, но е погрешно кога и защо да се използват променливи на таблицата. От гледна точка на скоростта, зависи от това как ще го направите и колко голям ще бъде той. Няма статистика. Не можете да създавате вторични индекси. Не можете да го промените. Също така няма връщане назад. А обхватът е много ограничен. Което води и до някои от неговите предимства.
- person Gerard ONeill; 27.08.2013
Променливата на таблицата не се регистрира. Ето защо определено е по-бързо за малки количества данни.
- person Patrick Honorez; 24.01.2014
Моля, актуализирайте отговора, за да премахнете грешната информация за променливите на таблицата, въведени в паметта. Обърнете се към този отговор за точна информация относно променливите на таблицата спрямо временните таблици.
- person Jacob Stamm; 22.01.2020
нямате нужда от OPENQUERY. Просто поставете „INTO #AnyTableName“ между списъка за избор и FROM на всяка заявка...
SELECT *
INTO #Temp1
FROM table1
WHERE x=y
person
KM.
schedule
27.03.2009
или Изберете * в #Temp1 от таблица1, където 0 = 1
- person Chris Burgess; 31.03.2009
Не забравяйте да направите
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