【问题标题】:Dynamic SQL Insertion Script Error: Invalid Column Name动态 SQL 插入脚本错误:列名无效
【发布时间】:2014-08-06 16:27:49
【问题描述】:

我编写了一个存储过程来向表中插入新行,我希望对其进行概括,以便单个过程可以根据输入将行添加到一系列表中的任何一个。这是目前定义个别情况的查询:

CREATE PROCEDURE [Test].[NO001CreateRow]
@InstanceID char(5)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.NO001 (InstanceID)
VALUES (@InstanceID)
END
GO

这似乎工作正常。 InstanceID 是表 NO001 中键值列的名称。该过程将新行插入 NO001,并将 InstanceID 的值设置为输入 @InstanceID。

这是定义我为一般情况所做的过程的查询:

CREATE PROCEDURE [Test].[GenCreateRow]
@TableID nchar(5),
@InstanceID nchar(5)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql nvarchar(max) = 'INSERT INTO dbo.' + @TableID + ' (InstanceID)
VALUES (' + @InstanceID + ')'
EXEC sp_executesql @sql
END
GO

据我所知,此过程应向由输入的五个字符 @TableID 标识的表添加一个新行,其中列 InstanceID 由输入 @InstanceID 填充。但是,当我使用参数 @TableID=NO001 和 @InstanceID=XXXXX 运行该过程时,代码会中断并返回错误消息Invalid column name 'XXXXX'。

我不明白为什么它试图在表@TableID 中查找标题为@InstanceID 的列。我将列定义理解为第 7 行的括号内的 InstanceID,并且我不认为 InstanceID 应该自动假定 @InstanceID 的值。有谁知道这里发生了什么?

这是执行时显示的代码:

DECLARE @return_value int
EXEC @return_value = [Test].[GenCreateRow]
@FormID = N'NO001',
@InstanceID = N'XXXXX'
SELECT 'Return Value' = @return_value
GO

【问题讨论】:

  • 你试过没有sp_executesql吗?
  • EXEC改成PRINT看看。可能只是在您的值字符串周围缺少引号。

标签: sql stored-procedures dynamic-sql


【解决方案1】:

InstatnceID 是一个 nchar,因此在值中你需要引号来表示你正在组合的命令中的字符串值。

 DECLARE @sql nvarchar(max) = 'INSERT INTO dbo.' + @TableID + ' (InstanceID) VALUES (''' + @InstanceID + ''')'

它使您的代码从此运行

INSERT INTO dbo.TableName (InstanceID) VALUES (IDVALUE)

INSERT INTO dbo.TableName (InstanceID) VALUES ('IDVALUE') 

当你执行它时。

【讨论】:

    【解决方案2】:

    尝试添加双撇号

    CREATE PROCEDURE [Test].[GenCreateRow]
    @TableID nchar(5),
    @InstanceID nchar(5)
    AS
    BEGIN
    SET NOCOUNT ON;
    DECLARE @sql nvarchar(max) = 'INSERT INTO dbo.' + @TableID + ' (InstanceID)
    VALUES (''' + @InstanceID + ''')'
    EXEC sp_executesql @sql
    END
    GO
    

    之所以有效,是因为您的代码是这样做的:

    INSERT INTO dbo.Table  (InstanceID) VALUES (XXX)
    

    我的代码是这样做的:

    INSERT INTO dbo.Table  (InstanceID) VALUES ('XXX')
    

    【讨论】:

    • @Bibliophael 我已经添加了解释。
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2018-09-14
    • 2021-08-15
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多