必须声明标量变量@Stringkey

时间:2013-09-16 08:20:34

标签: sql sql-server sql-server-2012

我正在尝试创建一个用新主键填充表的SQL脚本。

我目前从互联网搜索中得到的是以下

DECLARE @IntVariable int;
DECLARE @Stringkey varchar(2);
DECLARE @SQLString nvarchar(500);
DECLARE @Intupdater nvarchar(500);

SET @IntVariable = 00000001;
SET @Stringkey = 'CD';

SET @SQLString = N'UPDATE Tri_Damen_Live.trimergo.calendar_details SET details_key = @Stringkey + @IntVariable';
SET @Intupdater = N'@IntVariable = @IntVariable+1'

EXECUTE sp_executesql @SQLString , N'@IntVariable INT' , N'@Stringkey VARCHAR(2)', @IntVariable, @Stringkey;

我得到的错误是

  

Msg 102,Level 15,State 1,Line 1
  '='附近的语法不正确。
  Msg 137,Level 15,State 2,Line 1
  必须声明标量变量“@Stringkey”。

我对我的问题有几个问题,希望有人能帮助我

第一个问题:似乎我的int增加器是错误的。有没有办法为int?

创建更新变量语句

第二:我将int声明为00000001.但我怀疑它是这样的。我这样做的原因是因为密钥需要总共设置10个字符长(例如'CD00000001'等)这样做是否可以这样工作还是有另一种方式?

第三个问题:正如主题所述。 '必须声明标量变量'@Stringkey“。'错误。我删除了stringkey部分,但后来它说明了Int变量的相同错误。我在顶部宣布它们并设置它们。我错过了什么?

辅助信息:

此函数将用于具有不同表大小的多个数据库。所以我需要这种函数来说明它没有一定数量的更新语句。

此处创建的主键必须是一个长度为10个字符的字符串(Varchar(10))。似乎是一个愚蠢的要求,但它已被选中使用这个系统。

我正在使用Microsoft SQL Server 2012来运行它。

3 个答案:

答案 0 :(得分:3)

1您无法将int添加到类似的字符串中。您需要将int转换为字符串

   @Stringkey + convert(varchar(10),@IntVariable)

2 int是一个数字。如果你想要格式化它,你需要自己做。

   SET details_key = @Stringkey + right(''0000000000''+convert(varchar(8),@IntVariable),8)

3 sp_executesql中的变量声明应为

N'@IntVariable INT, @Stringkey VARCHAR(2)'

EXECUTE sp_executesql @SQLString , N'@IntVariable INT, @Stringkey VARCHAR(2)', @IntVariable, @Stringkey;

或者,您可以考虑使用SEQUENCE - 请参阅http://raresql.com/2013/06/21/sql-server-2012-how-to-generate-a-varchar-sequence-number-using-sequence-object/

答案 1 :(得分:1)

sp_executesql的第二个参数应该是包含所有参数定义的单个字符串:

EXECUTE sp_executesql @SQLString , N'@IntVariable INT,@Stringkey VARCHAR(2)', @IntVariable, @Stringkey;

答案 2 :(得分:0)

SET @SQLString = N'UPDATE Tri_Damen_Live.trimergo.calendar_details SET details_key = @Stringkey + @IntVariable';

您正在尝试连续@Stringkey + @IntVariable => (string + int) 您应该将 @IntVariable 转换为varchar