sql - 如何在存储过程中从 VARIABLE 表中选择数据
问题描述
我正在寻找从用户定义类型变量中读取数据的方法,当我这样做时:
我收到此错误:
必须声明标量变量“@mytabe”。
代码:
CREATE TYPE CD_info AS TABLE
(
sestem_id nvarchar(10),
national_id nvarchar(14),
employee_name nvarchar(80),
salary money,
department nvarchar(80)
)
CREATE PROCEDURE Insert_CDInfo
@mytabe CD_info READONLY ,
@monthes int,
@TBname NVARCHAR(50)
AS
BEGIN
DECLARE @insertSql VARCHAR(MAX) = 'insert into' + @TBname +'(sestem_id, national_id,employee_name,salary,department)'+
'select top (1000000) sestem_id,national_id,employee_name,salary,department from '+ [@mytabe]
EXEC @insertSql
END
谢谢
解决方案
表值参数仅在声明它的范围内可用,因此您不能在动态 SQLEXECUTE
语句中使用它。
而不是EXECUTE
使用参数化的 SQL 语句并使用sp_executesql
. 这将允许您将 TVP 作为参数传递到动态 SQL 的内部范围。例如:
CREATE PROCEDURE Insert_CDInfo
@mytabe CD_info READONLY ,
@monthes int,
@TBname NVARCHAR(50)
AS
BEGIN
DECLARE @insertSql nvarchar(MAX) =
N'INSERT INTO ' + QUOTENAME(@TBname) +' (sestem_id, national_id,employee_name,salary,department) '
+ N'SELECT TOP (1000000) sestem_id,national_id,employee_name,salary,department FROM @mytabe;';
EXEC sp_executesql
@insertSql
, N'@mytabe CD_info READONLY'
, @mytabe = @mytabe;
END
GO
推荐阅读
- python - 如何在 Python 上使用 bs4/selenium 从解析的代码中创建 Pandas DataFrame?
- xamarin.forms - 在 Xamarin.Forms 中检测到人脸时是否可以自动捕获图像?
- elisp - 用elisp构造一个map函数
- java - 使用appium将元素滚动到视图中不适用于iOS
- android - 使用视频全屏模式(横向)时,颤振咀嚼处理不起作用
- r - weekdays() 函数中的 NA
- r - 有没有办法使用 ggplot2 在箱线图上输入 beta 分布?
- assembly - 如何从特定地址开始执行汇编代码?
- r - 使用 grid.arrange 组合来自不同数据集(不同大小)的 ggplot 时出错
- flutter - 这在颤振中意味着什么?