为什么我不能使用变量代替参数的字符串

时间:2012-03-06 13:42:16

标签: sql sql-server

为什么这样做:

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 个答案:

答案 0 :(得分:2)

来自MSDN上"ALTER DATABASE File and Filegroup Options"

<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)