Ответ: В версии MS SQL Server 2000 появился новый тип переменной table. Когда в первый раз слышишь об этом типе, то сразу начинаешь мечтать о возможности обмена информацией в табличном виде между процедурами, о передаче таблицы в процедуру и т.п. Реальность оказывается прозаичнее.
Тип table похож на временные таблицы, но область видимости у этого типа такая же, как и у всех локальных переменных.
И для чего же он тогда нужен, если есть временные таблицы? И чем он лучше и чем хуже временных таблиц?
Главное предназначение этого типа заключается во временном хранении набора строк, который возвращается пользовательской функцией (о пользовательских функциях будет написано в следующей рассылке). Практически во всех других случаях этот тип вполне можно заменить временной таблицей.
Работа с переменной table производится также как и с временной таблицей с помощью операторов SELECT, INSERT, UPDATE и DELETE. Операция присвоения между переменными table не допускается.
В отличие от временных таблиц на этот тип наложен ряд ограничений:
1. Запрещено использование операторов следующего вида:
INSERT INTO переменная_table EXEC хранимая_процедура
SELECT список_колонок INTO переменная_table
2. Ограничения CHECK, DEFAULT значения и вычисляемые колонки табличных переменных не могут использовать пользовательские функции.
3. Запрещено создание индексов, за исключением индекса PRIMARY KEY и ограничения UNIQUE, которые создаются при объявлении переменной.
Тем не менее, у этого типа есть преимущества перед временными таблицами:
1. Использование переменной table вместо временной таблицы уменьшает время перекомпиляции хранимой процедуры.
2. При использовании переменной table расходуется меньше ресурсов на блокировку и ведение журнала транзакций. Но при этом переменные не попадают под действие команды ROLLBACK TRANSACTION.
DECLARE @MyTable TABLE (ID int IDENTITY PRIMARY KEY, Name varchar (50))
INSERT INTO @Mytable
SELECT 'String 1'
UNION ALL
SELECT 'String 2'
UNION ALL
SELECT 'String 3'
BEGIN TRAN
UPDATE @MyTable SET Name='New String' WHERE ID=2
ROLLBACK TRAN
SELECT * FROM @MyTable
GO
Результат работы скрипта:
(3 row(s) affected)
(1 row(s) affected)
ID Name
----------- --------------------------------------------------
1 String 1
2 New String
3 String 3
(3 row(s) affected)
Но при проведении практических экспериментов перечисленные преимущества не всегда бывают очевидны.
На этом закончим.
АНОНС РАССЫЛОК:
Уроки для начинающих по SQL Server. Создание баз данных, администрирование,
программирование, использование языка T-SQL, написание клиентских
приложений.
Уроки по программированию на C++ Builder. Библиотека VCL, создание
собственных компонентов, работа с базами данных, примеры, FAQ.
Уроки разбиты на серии. Каждая серия независима от других.
Уроки по ассемблеру. Использование MASM, примеры, FAQ.
Надеюсь, Вы нашли эту информацию полезной. Вопросы, предложения и пожелания шлите на адрес sql@likor.ru С уважением, Сергей Кошкин.
Архив рассылки смотрите на сайте Рассылки http://sql.softmatics.ru/