Как использовать табличную переменную в динамическом SQL? ИЛИ создать временную таблицу из определенного пользователем типа таблицы?
Я использую SQL Server 2016, и я создал пользовательский табличный тип, как показано ниже:
CREATE TYPE [dbo].[UDTT_Items] AS TABLE(
[ItemId] int identity(1, 1),
[ItemCode] [varchar](10) NULL,
[ItemName] [varchar](255) NULL,
[StockQty] decimal(18,3 ) NULL,
PRIMARY KEY CLUSTERED
(
[ItemId] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
В моей хранимой процедуре я могу создать переменную таблицы следующим образом:
declare @tblItems UDTT_Items
Я могу вставить данные в эту табличную переменную и сделать запросы выбора.
select * from @tblItems
Проблема, с которой я столкнулся, когда мне нужно поместить эту таблицу в динамический SQL. Например, если я пытаюсь запустить приведенный выше оператор select из execute caluse:
EXECUTE SP_EXECUTESQL N'select * from @tblItems'
Это дает мне сообщение об ошибке:
Must declare the table variable "@tblItems".
Я пытался использовать временную таблицу variabe (с #) внутри динамического sql, и она прекрасно работает, но я не знаю, смогу ли я создать временную таблицу с уже определенным пользователем типом таблицы. Мне нужно что-то вроде этого:
create #tblItems UDTT_Items
Но это тоже не работает.
Кто-нибудь может подсказать, как можно обойти эту проблему, используя переменную таблицы в динамическом sql или создавая временную таблицу из определяемого пользователем типа таблицы?
1 ответ
Я могу придумать следующие обходные пути, чтобы решить эту проблему с помощью вашего UDTT:
1. Объявите переменную UDTT в вашем динамическом скрипте, а затем вы также можете получить результаты оттуда:
EXECUTE SP_EXECUTESQL
N'
DECLARE @dynvariable [UDTT];
insert @dynvariable values (1);
select * from @dynvariable';
2. Передайте переменную UDTT в SP_EXECUTESQL
, но тогда это только для чтения, то есть вы можете только select
в динамическом скрипте:
DECLARE @variable [UDTT];
insert @variable values (1);
EXECUTE SP_EXECUTESQL
N'select * from @dynvariable',
N'@dynvariable [UDTT] READONLY',
@dynvariable=@variable;
3. Я думаю, что невозможно "создать временную таблицу из UDTT", поэтому ваш подход заключается в динамическом создании временной таблицы с использованием системной информации для вашего UDTT (столбцы, типы и т. Д.).
4. Считая, что вы хотите иметь "динамический" сводный код, наиболее подходящим было бы динамическое создание сводного оператора на основе информации столбцов и значений целевой таблицы.