我正在尝试创建一个用新主键填充表的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来运行它。
答案 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