首页 > 解决方案 > 如何在存储过程中从 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 

谢谢

标签: sqlsql-servertsql

解决方案


表值参数仅在声明它的范围内可用,因此您不能在动态 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

推荐阅读