Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 table variables vs local temporary table  [new]
Быдло____кодер
Guest
Есть ли еще какая то разница между этими сущностями кроме того, что local temporary table можно юзать в динамическом скл и вложенных процедурах?
27 июн 17, 09:43    [20592852]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Может стоить погуглить? На SO уже вполне доходчиво все расписали:

https://stackoverflow.com/questions/11857789/when-should-i-use-a-table-variable-vs-temporary-table-in-sql-server
https://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server

и тд.

Наиболее полный ответ у Мартина Смита
27 июн 17, 09:46    [20592861]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
Быдло____кодер
Есть ли еще какая то разница между этими сущностями кроме того, что local temporary table можно юзать в динамическом скл и вложенных процедурах?

Временная таблица участвует в транзакции, а таблицная переменная нет.
27 июн 17, 11:17    [20593199]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
SQL2008
Быдло____кодер
Есть ли еще какая то разница между этими сущностями кроме того, что local temporary table можно юзать в динамическом скл и вложенных процедурах?

Временная таблица участвует в транзакции, а таблицная переменная нет.

умеют удивлять...
27 июн 17, 11:41    [20593351]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Быдло____кодер
Guest
Спасибо за ответы, пошел курить стековерфлоу
27 июн 17, 11:49    [20593408]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
TaPaK
SQL2008
пропущено...

Временная таблица участвует в транзакции, а таблицная переменная нет.

умеют удивлять...

Коллега не согласен?
27 июн 17, 12:26    [20593556]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
SQL2008
TaPaK
пропущено...

умеют удивлять...

Коллега не согласен?

отнюдь. Переменные более известный факт не откатывания, табличные переменные да ещё и в связке с транзакцией не приходилось извращаться, хотя и из первого вытекает вообщем-то
27 июн 17, 12:30    [20593572]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Вот, кстати, удивительно, что ты не в курсе. Я, например, узнал это еще в на 2000 сервере.
Собственно табличная переменная способ протащить датасет сквозь транзакцию.
27 июн 17, 12:51    [20593654]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Cammomile
Вот, кстати, удивительно, что ты не в курсе. Я, например, узнал это еще в на 2000 сервере.
Собственно табличная переменная способ протащить датасет сквозь транзакцию.

ну тут любители всяких, мне хватет TRY/CATCH :)
27 июн 17, 13:20    [20593747]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
А как тебе трайкетч поможет записать в лог что-то, что было откачено?
27 июн 17, 13:30    [20593791]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Cammomile
А как тебе трайкетч поможет записать в лог что-то, что было откачено?

DROP TABLE IF EXISTS #a
CREATE TABLE #a (ID int IDENTITY (1,1))
BEGIN TRY
	BEGIN TRAN
		INSERT INTO #a  DEFAULT VALUES
		INSERT INTO #a  DEFAULT VALUES
		SELECT 1/0

	COMMIT TRAN 
END TRY
BEGIN CATCH
	--А как тебе трайкетч поможет записать в лог что-то, что было откачено?
	SELECT * FROM #a
	IF @@TRANCOUNT > 0 
		ROLLBACK TRAN 
END CATCH
27 июн 17, 13:50    [20593833]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
msLex
Member

Откуда:
Сообщений: 7724
SQL2008
Временная таблица участвует в транзакции, а таблицная переменная нет.


А что в вашем понимании "участвует в транзакции"?
27 июн 17, 14:02    [20593862]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
msLex
SQL2008
Временная таблица участвует в транзакции, а таблицная переменная нет.


А что в вашем понимании "участвует в транзакции"?

Будучи измененной внутри транзакции, теряет эти изменения при роллбэке.
27 июн 17, 15:14    [20594123]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
msLex
Member

Откуда:
Сообщений: 7724
SQL2008
Будучи измененной внутри транзакции, теряет эти изменения при роллбэке.

При любом?
27 июн 17, 15:16    [20594128]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
msLex
Member

Откуда:
Сообщений: 7724
msLex
При любом роллбэке?
27 июн 17, 15:17    [20594129]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
msLex
Member

Откуда:
Сообщений: 7724
msLex
msLex
При любом роллбэке?

Даже не так...
Данные, попавшие в табличную переменную, останутся в ней при любом роллбеке (с учетом того, что сессия останется жива)?
27 июн 17, 15:19    [20594138]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
msLex,

Вы не говорите загадками. Знаете случай когда откат транзакции влияет на данные в табличной переменной - так привидите пример :)
27 июн 17, 16:14    [20594352]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
rnk
Member

Откуда:
Сообщений: 126
Быдло____кодер,

Табличные переменные нельзя транкейтить. Это неудобно, когда нужна быстрая очистка таблицы.
27 июн 17, 16:26    [20594435]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
TaPaK
Cammomile
А как тебе трайкетч поможет записать в лог что-то, что было откачено?

DROP TABLE IF EXISTS #a
CREATE TABLE #a (ID int IDENTITY (1,1))
BEGIN TRY
	BEGIN TRAN
		INSERT INTO #a  DEFAULT VALUES
		INSERT INTO #a  DEFAULT VALUES
		SELECT 1/0

	COMMIT TRAN 
END TRY
BEGIN CATCH
	--А как тебе трайкетч поможет записать в лог что-то, что было откачено?
	SELECT * FROM #a
	IF @@TRANCOUNT > 0 
		ROLLBACK TRAN 
END CATCH


 DROP TABLE #a
 GO 
CREATE TABLE #a (ID int , VAL numeric(5,2), isGood bit default 0 )
BEGIN TRY
	BEGIN TRAN
		INSERT INTO #a  (id, val) 
	  /*тестовые данные*/
    SELECT TOP 10000 RN = Row_Number() over (order by 1/0), Val = 42  from  spt_values a cross join spt_values b
    UPDATE #a SET val = 0 WHERE ID = 4242 

    /*сложная бузинесс логика */
   UPDATE a SET IsGood = 1 FROM #a  a
   WHERE 1/val > 0
    

	COMMIT TRAN 
END TRY
BEGIN CATCH
   /*вот тут я бы хотел узнать какой айди ломает апдейт    */ 
	IF @@TRANCOUNT > 0 
		ROLLBACK TRAN 
END CATCH
 
27 июн 17, 16:32    [20594454]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
msLex
Member

Откуда:
Сообщений: 7724
felix_ff
так привидите пример

откат стейтмента
27 июн 17, 16:37    [20594474]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Cammomile



дурной пример

плохой пример, просим пардону
27 июн 17, 16:51    [20594525]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4098
msLex
msLex
пропущено...

Даже не так...
Данные, попавшие в табличную переменную, останутся в ней при любом роллбеке (с учетом того, что сессия останется жива)?

+ на правах флейма
О нет!
Есть один случай когда данные не останутся.

Мало кто знает, что перед созданием Мира Господь сказал BEGIN TRAN.
И если он, в силу разных причин, скажет ROLLBACK TRAN, то данные в табличных переменных не останутся...
Как, впрочем, не останутся сами таблицы, базы данных, сервера, пользователи и админы этих серверов,
датацентры в которых располагались сервера, города в которых были построены датацентры... и т.п.

Правда, этого уже никто не заметит.
Кроме Всевышнего разумеется.
27 июн 17, 17:24    [20594613]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
TaPaK
Cammomile
А как тебе трайкетч поможет записать в лог что-то, что было откачено?

DROP TABLE IF EXISTS #a
CREATE TABLE #a (ID int IDENTITY (1,1))
BEGIN TRY
	BEGIN TRAN
		INSERT INTO #a  DEFAULT VALUES
		INSERT INTO #a  DEFAULT VALUES
		SELECT 1/0

	COMMIT TRAN 
END TRY
BEGIN CATCH
	--А как тебе трайкетч поможет записать в лог что-то, что было откачено?
	SELECT * FROM #a
	IF @@TRANCOUNT > 0 
		ROLLBACK TRAN 
END CATCH

CREATE PROC proc2
AS
	BEGIN TRY
	RAISERROR ('some serious shit here', 16,1)
	END TRY

	BEGIN CATCH
	ROLLBACK
	END CATCH
GO

CREATE PROC Proc1
AS
	BEGIN TRY

	BEGIN TRAN
	CREATE TABLE #a ( id int )
	INSERT INTO #a
	SELECT 42
	EXEC proc2
	COMMIT TRAN
	END TRY
	BEGIN CATCH
   /*where is ur trycatch now? */
	SELECT *
		FROM #a
	END CATCH
GO


GO

CREATE PROC Proc1_TV
AS
	BEGIN TRY

	BEGIN TRAN
	DECLARE @a TABLE ( id int )
	INSERT INTO @a
	SELECT 42
	EXEC proc2
	COMMIT TRAN
	END TRY
	BEGIN CATCH
   
	SELECT *
		FROM @a
	END CATCH
GO


GO


EXEC proc1
EXEC Proc1_TV

GO
DROP PROC proc1
DROP PROC proc1_TV
DROP PROC proc2
27 июн 17, 17:26    [20594621]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Sandist
Member

Откуда:
Сообщений: 397
такой вопрос возник
Если происходит insert во временную таблицу #a, растет ли лог tempdb?
Если происходит insert в табличную переменную @a, растет ли лог tempdb?
15 сен 17, 21:16    [20799983]     Ответить | Цитировать Сообщить модератору
 Re: table variables vs local temporary table  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
Sandist
Если происходит insert во временную таблицу #a, растет ли лог tempdb?
Если происходит insert в табличную переменную @a, растет ли лог tempdb?
если под "растёт" вы понимаете - "происходит ли запись в транзакшен-лог", то на оба вопроса ответ один: да запись происходит.
15 сен 17, 22:31    [20800080]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить