【问题标题】:T-SQL: BACKUP CERTIFICATE - Using variables with the T-SQL statementT-SQL:备份证书 - 在 T-SQL 语句中使用变量
【发布时间】:2012-07-20 17:44:28
【问题描述】:

我有一组 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' 附近的语法不正确。看起来变量不能在这种类型的语句中使用。有人可以帮助我了解这是否属实吗?

有没有办法让这个备份与变量一起工作?

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

【问题讨论】:

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


    【解决方案1】:

    使用动态 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 个字符,最好指定它,以便下一个访问代码的开发人员不会将缺少长度视为错误并浪费时间试图弄清楚它应该是什么是或者那是否是一个错误。
    • 避免被专家暗中嘲笑为无知的初学者,从而提高您的声誉。

    【讨论】:

    • 你可以使用QUOTENAME(@somefilepath, '''')
    • 啊,是的,谢谢@Remus,我忘了你可以为quotename 提供一个字符。
    • @ErikE 谢谢!这非常有效。我会记住您关于为 char 数据类型指定长度的观点。这个建议的原因是什么?了解原因将帮助我记住这样做。
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多