【发布时间】: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