对于具有自定义用户定义数据类型错误的动态StoredProcedure:必须声明标量变量“@ myTableType2”

时间:2016-09-09 12:45:59

标签: sql-server sql-server-2008 user-defined-types sp-executesql

我必须将批量数据插入数据库,并且还动态创建表。

首先创建了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表中。

--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 

得到错误:

  

消息137,级别16,状态1,过程dumpData,第12行必须声明   标量变量“@ myTableType2”

3 个答案:

答案 0 :(得分:1)

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

    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

答案 1 :(得分:0)

尝试将tablename添加为字符串..

喜欢

npm install

我想这可以解决你的问题

答案 2 :(得分:0)

我遇到了相同的情况,并通过首先动态创建表然后从临时表中读取数据来解决

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)