【发布时间】:2013-03-25 17:05:37
【问题描述】:
我有以下存储过程:
CREATE PROCEDURE [cafgAddCoreID]
@HoldingName nvarchar (50) = null
@CountStart int = 0,
AS
DECLARE @sql nvarchar (50)
DECLARE @bit nvarchar (200)
BEGIN
SET @bit = 'MTR1- + CAST ((' + @CountStart + ' + ROW_NUMBER()
OVER (ORDER BY [FindNo])) AS NVARCHAR(10))'
SET @sql = 'INSERT INTO ' + @HoldingName + '([CoreID])
SELECT (' + @bit + ') FROM [DectectoristMetalFinds]'
EXEC @sql
END
但是当我跑步时:
EXEC [cafgAddCoreID] 'Table1', 9
我明白了
将 varchar 值 'MTR1- + CAST ((' )转换为数据类型 int 时转换失败。
跑步
INSERT INTO [Table1] ([CoreID])
SELECT ('MTR1-' + CAST ((0 + ROW_NUMBER() OVER (ORDER BY FindNo))
AS NVARCHAR(10))) AS CoreID FROM [Table2]
有效,所以我知道该方法是正确的,但显然不是在存储过程中。
【问题讨论】:
-
在执行
@sql之前,你调查过它的值吗? -
您需要确保
MTR1-被适当数量的撇号包围。此外,heeeeello SQL 注入攻击。 -
抱歉,我不知道如何检查@sql 的值,因为我是存储过程的新手。
-
尝试
PRINT @sql;,但根据错误,您不会走那么远。您需要将 @CountStart 设置为字符串才能构建字符串。
标签: sql-server stored-procedures