2012-03-06 56 views
2

为什么这个工作:代替串为什么我不能用一个变量参数

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'附近的语法不正确。

回答

2

我相信这是因为ALTER的具体情况,当你明确指定一个值时,它将是一个常量,如果是变量 - 值将在运行时解析。

反正你可以通过使用动态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) 
2

"ALTER DATABASE File and Filegroup Options" MSDN上:

<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语法中的大量问题有关,并且解析器仍然是一个非常简单/愚蠢的解析器,他们不想修改太多(除了添加新功能)。

相关问题