代码之家  ›  专栏  ›  技术社区  ›  M_Idrees

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

  •  1
  • M_Idrees  · 技术社区  · 6 年前

    我使用的是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查询。

    select * from @tblItems
    

    当我需要把这个表放到动态sql中时遇到的问题。例如,如果我试图从execute caluse运行上面的select语句:

    EXECUTE SP_EXECUTESQL N'select * from @tblItems'
    

    Must declare the table variable "@tblItems".
    

    create #tblItems UDTT_Items 
    

    但它也不起作用。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Vladislav    6 年前

    我可以想出以下解决方法来使用您的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;   
    


    三。我认为“从UDTT创建临时表”是不可能的,所以您的方法是使用UDTT的系统信息(列、类型等)动态创建临时表。