动态SQL插入脚本错误:列名无效

时间:2014-08-06 16:27:50

标签: sql stored-procedures dynamic-sql

我编写了一个存储过程来向表中插入一个新行,我希望对它进行概括,以便单个过程可以根据输入向任何一个表中添加行。以下是目前定义个案的查询:

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运行该过程时,代码会中断并返回错误消息无效的列名称' 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

2 个答案:

答案 0 :(得分:3)

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

执行时。

答案 1 :(得分: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')