T-SQL:BACKUP CERTIFICATE - 使用带有T-SQL语句的变量

时间:2012-07-20 17:44:29

标签: sql-server sql-server-2008 tsql ddl

我有一组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);

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

有没有让这个备份与变量一起使用?

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

1 个答案:

答案 0 :(得分: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/char参数的默认长度为1个字符。
  • 在其他情况下,n/var/char参数的默认长度为30个字符,可能适用于varchar版本,但char几乎肯定是错误的}。如果该值用于使用SELECT INTO创建表,则它将是一个神秘的长度,而不是明确选择的。
  • 未明确定义您的长度会强制访问您的代码的下一位开发人员知道varchar长度的确切规则,并且可能会欺骗他,因为它是隐式而非显式的。假设列的长度需要更改,也会强制参数长度更改,但由于参数没有长度,因此会跳过它。
  • 如果你真的想要1个字符或30个字符,最好指定它,以便下一个访问代码的开发人员不会将缺少长度视为错误,并浪费时间试图找出它应该是什么是或是否是一个错误。
  • 这将有助于你的声誉,让你不会被专家暗中嘲笑为无知的初学者。