我有以下存储过程:
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]
有效,所以我知道方法是正确的,但显然不是在存储过程中。
答案 0 :(得分:3)
您不能在字符串中“添加”整数。数据类型优先级将尝试将周围的文字转换为int。相反,您需要将int显式更改为字符串:
SET @bit = '''MTR1-'' + CAST ((' + CONVERT(VARCHAR(12), @CountStart) + '...
这仍然看起来不会解析正确,但应该让你到达可以通过发布进一步调查的点:
PRINT @sql;
而不是:
EXEC @sql;
你也想要使用:
EXEC(@sql);
或者更好:
EXEC sp_executesql @sql;
(您可以使用它来参数化@CountStart并避免使用一个向量进行SQL注入。我会为您编写该版本,但是从您的问题中无法判断您首先尝试生成哪些有效的SQL。 )
您可能还需要考虑向@sql
提供超过50个字符。只是一个想法。