我可以使用变量作为CREATE SERVER AUDIT语句的选项AUDIT_GUID的值吗?

时间:2014-05-17 00:30:07

标签: sql sql-server-2012

我试图通过在SQL中使用NEWID()函数使CREATE SERVER AUDIT命令中的Audit_GUID值动态化。下面是我的SQL脚本:

USE [master]
GO

DECLARE @newGUID as uniqueidentifier

SET @newGUID = NEWID()

CREATE SERVER AUDIT Audit_Select_Queries    -- Name of the Audit(unique for a Server)
TO FILE 
(   FILEPATH = N'XXXX'                      -- Folder to Store Audit Files at
    ,MAXSIZE = 0 MB                         -- 0 = UNLIMITED
    ,MAX_ROLLOVER_FILES = 2147483647        -- Max possible number of Files
    ,RESERVE_DISK_SPACE = OFF
)
WITH
(   QUEUE_DELAY = 1000                      -- Delay Audit actions by this time for completion
    ,ON_FAILURE = CONTINUE                  -- Database operation is more important than Audit
    ,AUDIT_GUID = @newGUID                  -- UUID of the Audit (unique for a server)
)
ALTER SERVER AUDIT Audit_Select_Queries WITH (STATE = OFF)
GO

但是@newGUID附近有一个语法错误,"' @ newGUID'"''''' 请让我知道我做错了什么。

编辑:我正在使用Microsoft SQL Server 2012

1 个答案:

答案 0 :(得分:1)

不......

CREATE SERVER AUDIT是一个声明 - 因此AUDIT_GUID不是参数'与存储过程的SQL Server参数是参数的方式相同。如果您熟悉其他语言,则可以将CREATE SERVER AUDIT视为特殊形式'因此,您只需记住它不接受该选项的变量。

我可以理解为什么会让人感到困惑,例如,BACKUP语句允许某些参数的变量' (" options"),即数据库的名称;例如这是完全有效的T-SQL:

DECLARE @databaseName nvarchar = "insert_name_of_database_here";

BACKUP DATABASE databaseName
...

为澄清这些类型的问题,如果您不记得某些参数或选项是否接受变量,请查阅Microsoft相关SQL Server版本的文档。 [您可以通过突出显示语句,内置程序等,并在键盘上按 F1 轻松打开SSMS中的相关文档。]

但是,如果您愿意动态生成T-SQL ......

以下是如何使用动态SQL(通过EXECUTEsp_executesql)来执行您尝试执行的操作:

DECLARE @dynamicSql nvarchar(1000);

SELECT @dynamicSql = 'CREATE SERVER AUDIT
    ...
    AUDIT_GUID = ''' + CAST(@newGUID AS nvarchar(255)) + ''''
    + '...' + ...,

EXEC sp_executesql @dynamicSql;