我试图通过在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
答案 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中的相关文档。]
以下是如何使用动态SQL(通过EXECUTE
或sp_executesql
)来执行您尝试执行的操作:
DECLARE @dynamicSql nvarchar(1000);
SELECT @dynamicSql = 'CREATE SERVER AUDIT
...
AUDIT_GUID = ''' + CAST(@newGUID AS nvarchar(255)) + ''''
+ '...' + ...,
EXEC sp_executesql @dynamicSql;