0

我有以下存储过程:

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]

有效,所以我知道该方法是正确的,但显然不在存储过程中。

4

1 回答 1

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. 只是一个想法。

于 2013-03-25T17:08:01.900 回答