【问题标题】:For dynamic StoredProcedure with custom user defined datatype error: Must declare the scalar variable "@myTableType2"对于具有自定义用户定义数据类型错误的动态 StoredProcedure:必须声明标量变量“@myTableType2”
【发布时间】:2016-09-09 12:45:58
【问题描述】:

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

首先创建了 UserDefined DataTypes

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

然后我有我必须插入到 SQL 表中的 DataTable (C#)。

--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 必须声明 标量变量“@myTableType2”

【问题讨论】:

  • 删除 set @myTableType2=@myTableType; 使用 insert into select query to copy..我不确定。
  • 已经尝试不设置 @myTableType2=@myTableType; 不工作
  • 这不起作用,因为您正在构建一个以“select * from”结尾的命令,而不是与表名连接而是与表本身连接。
  • @GuidoG:insert into tableA select * from tableB 这个查询有效,但现在我动态地进行此查询,因为我必须将表名和数据表作为参数传递
  • 是的,但 @myTableType2 是一个值为 "tableB" 的 varchar 吗?

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


【解决方案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

【讨论】:

  • 得到这个错误必须声明标量变量“@myTableType”
  • 同样的问题,你不能将用户定义的类型连接到@sql varchar中。
  • 请检查您是否在您的数据库中创建了用户定义的表类型 [Custom_block]。
  • @GuidoG:与'@sql varchar'无关
  • 你正在设置 @@sql = 'some text' + somevariable。仅当某些变量可以转换为文本并且我没有弄错 @@myTableType2 不能转换为文本时,这才有效
【解决方案2】:

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

喜欢

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

我想这会解决你的问题

【讨论】:

  • 正是我试图在我的 cmets 中解释的内容,你在现场
  • 这行不通,我的问题是使用User Defined Type .i.e 在我的情况下是一个表而不是VARCHAR()
  • 是的,但您不能将用户定义的类型连接到 @sql varchar
  • 你说 - 执行 'select * from tablename' 将不起作用,因为表名是字符串?
【解决方案3】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 2017-07-16
    • 2017-03-07
    • 2014-01-06
    • 2014-08-06
    相关资源
    最近更新 更多