为什么这样做:
ALTER DATABASE TEST2 MODIFY FILE ( NAME = TEST1, NEWNAME = TEST2, FILENAME = 'C:\Data\TEST2')
但这不起作用:
DECLARE @PATH NVARCHAR(255)
SET @PATH = 'C:\Data\TEST2'
ALTER DATABASE TEST2 MODIFY FILE ( NAME = TEST1, NEWNAME = TEST2, FILENAME = @PATH)
我收到错误:
Msg 102,Level 15,State 1,Line 5 '@PATH'附近的语法不正确。
答案 0 :(得分:2)
:
<filespec>::=
(
NAME = logical_file_name
[ , NEWNAME = new_logical_name ]
[ , FILENAME = {'os_file_name' | 'filestream_path' } ]
[ , SIZE = size [ KB | MB | GB | TB ] ]
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]
[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB| % ] ]
[ , OFFLINE ]
)
您会注意到FILENAME
被明确列为以'
引号开头和结尾的内容。因此,此处仅支持文字字符串。
这是一个令人不满意的答案 - 它并没有给出根本原因 - 但由于我不为MS工作,我无法给出更深层次的答案。我怀疑它与T-SQL语法中的大量内容相关,并且解析器仍然是一个非常简单/愚蠢的解析器,他们不想修改太多(除了添加新功能)。
答案 1 :(得分:2)
我认为这是因为ALTER
细节,当你明确指定一个值时,它将是一个常量,如果是变量 - 值将在运行时解析。
无论如何,您可以使用Dynamic Sql传递自定义变量值:
DECLARE @name varchar(128)
DECLARE @query varchar(255)
SET @name = '...'
SET @query = 'ALTER DATABASE TEST2 MODIFY FILE ( NAME = TEST1, NEWNAME = TEST2, FILENAME = '
+ @name
+ ')'
EXEC(@query)