如何在动态sql中使用table变量?或者从用户定义的 table 类型创建临时 table?

How to use table variable in dynamic sql? OR create temporary table from user defined table type?

我正在使用 SQL Sever 2016 并且我创建了用户定义的 table-类型如下:

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

在我的存储过程中,我可以像这样创建 table 变量:

declare @tblItems UDTT_Items

我可以在这个 table 变量中插入数据并且可以进行 select 查询。

select * from @tblItems

当我需要将此 table 放入动态 sql 时遇到的问题。例如,如果我尝试 运行 上面的 select 语句来自 execute caluse:

EXECUTE SP_EXECUTESQL N'select * from @tblItems'

它给我错误信息:

Must declare the table variable "@tblItems".

我尝试在动态 sql 中使用临时 table 变量(带#),它工作正常,但我不知道我是否可以创建临时 table 已经有用户-定义-table-类型。我需要这样的东西:

create #tblItems UDTT_Items 

但是还是不行。

任何人都可以建议如何解决这个问题,通过在动态 sql 中使用 table 变量,或者从用户定义的 table 创建临时 table =]-类型?

我可以想到以下解决方法来使用您的 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. 我认为 'create a temp table from UDTT' 是不可能的,因此您的方法是使用系统信息为您的 UDTT(列、类型等)动态创建临时 table。


4.读到你想要一个"dynamic"数据透视代码,最合适的是根据目标table.

的列信息和值动态生成数据透视语句