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

时间:2018-08-27 08:21:45

标签: sql-server sql-server-2016 temp-tables user-defined-types table-variable

我正在使用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中时遇到的问题。例如,如果我尝试从execute caluse运行上面的select语句:

EXECUTE SP_EXECUTESQL N'select * from @tblItems'

它给我错误信息:

Must declare the table variable "@tblItems".

我试图在动态sql中使用临时表variabe(带有#),并且工作正常,但是我不知道我是否可以使用用户定义表类型创建临时表。我需要这样的东西:

create #tblItems UDTT_Items 

但是它也不起作用。

有人可以建议如何通过使用动态sql中的表变量或通过用户定义的表类型创建临时表来解决此问题吗?

1 个答案:

答案 0 :(得分: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.读到您想拥有一个“动态”枢轴代码,最合适的方法是根据列信息和目标表的值动态生成枢轴语句。