将varchar值'n'转换为数据类型int时,另一个转换失败

时间:2013-03-25 17:05:37

标签: sql-server stored-procedures

我有以下存储过程:

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]

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

1 个答案:

答案 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个字符。只是一个想法。