For dynamic StoredProcedure with custom user defined datatype error: Must declare the scalar variable "@myTableType2"

For dynamic StoredProcedure with custom user defined datatype error: Must declare the scalar variable "@myTableType2"

我必须将批量数据插入数据库并且 table 也是动态创建的。

首先创建了 UserDefined DataTypes

-- This is my user  defined type
CREATE TYPE [dbo].[Custom_block] AS TABLE(
    [Name] [nvarchar](200) NULL,
    [population] [nvarchar](200) NULL
)

然后我有 DataTable (C#),我必须将其插入 SQL table。

--My StoredProcedure :
  CREATE PROCEDURE dumpData(
     @myTableType [Custom_block] readonly,
     @tableName NVARCHAR(200)
    )

AS 
BEGIN
 DECLARE @sql NVARCHAR(MAX);
 Declare @myTableType2 as [Custom_block];
 set @myTableType2=@myTableType;

 SET @sql=N' truncate table '+QUOTENAME(@tableName)+ '
    insert into '+QUOTENAME(@tableName)+' select * from '+@myTableType2

    EXECUTE sp_executesql  @sql
END 

获取错误:

Msg 137, Level 16, State 1, Procedure dumpData, Line 12 Must declare the scalar variable "@myTableType2"

尝试将表名添加为字符串..

喜欢

 CREATE PROCEDURE dumpData(
 @myTableType varchar(50),
 @tableName NVARCHAR(200)
)
 .....
 SET @sql=N' truncate table '+QUOTENAME(@tableName)+ '
insert into '+QUOTENAME(@tableName)+' select * from '+@myTableType2

我想这会解决您的问题

您不需要@myTableType2,您可以直接通过 table 值参数插入值。像这样尝试,

    CREATE PROCEDURE dumpData (
    @myTableType [Custom_block] readonly
    ,@tableName NVARCHAR(200)
    )
AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);

    SELECT *
    INTO #temp
    FROM @myTableType

    --DECLARE @myTableType2 [Custom_block];
    --SET @myTableType2 = @myTableType;
    SET @sql = N' truncate table ' + QUOTENAME(@tableName) + '
    insert into ' + QUOTENAME(@tableName) + ' select * from #temp'

    EXECUTE sp_executesql @sql

    DROP TABLE #temp
END

我遇到了同样的情况,通过先动态创建 table 然后从临时 table

读取数据来解决
DECLARE @insertQuery nvarchar(max)
SET @insertQuery= N'DECLARE @tempTable AS dbo.UserDefinedType
INSERT INTO @tempTable
SELECT ''39140752'',''18e22a74-bee3-462b-aee3-172df46291f3'',''test'' 
SELECT * FROM @tempTable'
EXEC (@insertQuery)