sql-server - 如何在动态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 中使用表变量,或者从用户定义的表类型创建临时表?
解决方案
我可以想到以下解决方法来使用您的 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语句。
推荐阅读
- python - 如何使用 OpenCV 测量齿轮的尺寸
- javascript - 如何使用javascript用超链接替换单词?
- javascript - ReactJS OnClick 函数在选定日期上呈现日期
- python - 如何在 django 模板中将 python 转换为 html
- html - 如何使用 gsub 替换所有以“border-”开头的类?
- vba - 在宏开始运行前 3 秒显示 Msgbox 并在 3 秒内自动关闭该 msgbox
- python - 有什么方法可以将 python pandas 数据帧转换为 NLP 语料库或文档?
- python - gzip 可以压缩数据而不将其全部加载到内存中,即流式传输/即时传输吗?
- python - 如何将 GPS 坐标转换为 xy 位置(笛卡尔坐标)以模拟无人机?
- html - 如何使用 svg 在另一个圆内绘制圆弧