Как использовать табличную переменную в динамическом SQL?ИЛИ создать временную таблицу из определенного пользователем типа таблицы? - PullRequest
0 голосов
/ 27 августа 2018

Я использую SQL Sever 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 Ответ

0 голосов
/ 27 августа 2018

Я могу придумать следующие обходные пути, чтобы решить эту проблему с помощью вашего 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. Чтение того, что вы хотите получить«динамический» сводный код, наиболее подходящим было бы динамическое создание сводного оператора на основе информации о столбцах и значений целевой таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...