首页 > 解决方案 > 如何在动态sql中使用表变量?或者从用户定义的表类型创建临时表?

问题描述

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

EXECUTE SP_EXECUTESQL N'select * from @tblItems'

它给了我错误信息:

Must declare the table variable "@tblItems".

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

create #tblItems UDTT_Items 

但它也不起作用。

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

标签: sql-serversql-server-2016temp-tablesuser-defined-typestable-variable

解决方案


我可以想到以下解决方法来使用您的 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.读到你想要一个“动态”的pivot代码,最合适的方法是根据目标表的列信息和值动态生成pivot语句。


推荐阅读