我有一组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'附近的语法不正确。看起来变量不能用在这种类型的语句中。有人可以帮我理解这是否属实?
有没有让这个备份与变量一起使用?
我有一个更大的脚本,我希望用户能够在一个位置轻松更改路径和密码,而不必在文件中搜索需要手动更改的位置。
答案 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
长度的确切规则,并且可能会欺骗他,因为它是隐式而非显式的。假设列的长度需要更改,也会强制参数长度更改,但由于参数没有长度,因此会跳过它。