如何在动态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.
的列信息和值动态生成数据透视语句
我正在使用 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.