0

我有一组 t-sql 语句,如下所示:

DECLARE @somefilepath as nvarchar = 'c:\somedir\somefile.ext';
DECLARE @anotherfilepath as nvarchar = 'c:\somedir\somefile2.ext';
DECLARE @somepassword as nvarchar = 'password';
BACKUP CERTIFICATE MyCertificate TO FILE = @somefilepath
WITH PRIVATE KEY (FILE = @anotherfilepath,
ENCRYPTION BY PASSWORD = @somepassword);

当我执行“解析”来测试语句时,我得到:“@somefilepath”附近的语法不正确。看起来变量不能在这种类型的语句中使用。有人可以帮我理解这是否属实吗?

反正有没有让这个备份与变量一起工作?

我有一个更大的脚本,我希望用户能够在一个位置轻松更改路径和密码,而不必在文件中搜索需要手动更改的位置。

4

1 回答 1

2

使用动态 SQL。

DECLARE
   @somefilepath as nvarchar(255) = 'c:\somedir\somefile.ext',
   @anotherfilepath as nvarchar(255) = 'c:\somedir\somefile2.ext',
   @somepassword as nvarchar(100) = 'password',
   @SQL as nvarchar(max);

SET @SQL = 'BACKUP CERTIFICATE MyCertificate TO FILE = ' + QuoteName(@somefilepath, '''') + '
WITH PRIVATE KEY (FILE = ' + QuoteName(@anotherfilepath, '''') + ',
ENCRYPTION BY PASSWORD = ' + QuoteName(@somepassword, '''') + ');';
EXEC (@SQL);

此外,始终始终char为您的数据类型指定一个长度。如果你不养成这个习惯,它总有一天会狠狠地咬你。以下是原因:

  • 在存储过程中,未定义长度的参数的默认长度为n/var/char1 个字符。
  • 在其他情况下,参数的默认长度为n/var/char30 个字符,这对于版本可能很好,varchar但对于char. 如果该值用于使用 SELECT INTO 创建表,它将是一个神秘的长度,而不是明确选择的长度。
  • 不明确定义您的长度会迫使下一个访问您的代码的开发人员知道varchar长度的确切规则,并且可能会诱使他出错,因为它是隐式的而不是显式的。假设列的长度需要改变,也强制参数长度改变,但由于参数没有长度,它被跳过。
  • 如果您确实需要 1 个字符或 30 个字符,最好指定它,以便下一个访问代码的开发人员不会将缺少长度视为错误并浪费时间试图弄清楚它应该是什么或是否那是个错误。
  • 它将帮助您避免被专家暗中嘲笑为无知的初学者,从而提高您的声誉。
于 2012-07-20T17:55:37.027 回答