GO 附近的语法不正确,T-SQL EXEC()

Incorrect Syntax Near GO, T-SQL EXEC()

我正在使用以下脚本:

DECLARE @dbName NVARCHAR(20) = 'ABC';
EXEC ( N' USE ' + @dbName + '
GO

-- Create Schema
CREATE SCHEMA meta
GO

-- Create Log Table
CREATE TABLE meta.LogAudit(
[EventDate] [datetime] NOT NULL DEFAULT (getdate()),
[EventType] [nvarchar](64) NULL
)
GO
'
);

但它抛出以下错误。

Msg 111, Level 15, State 1, Line 5
'CREATE SCHEMA' must be the first statement in a query batch.
Msg 102, Level 15, State 1, Line 22
Incorrect syntax near 'GO'.

这是为什么?

--

编辑:
这个答案似乎在回答我的问题: dynamic sql error: 'CREATE TRIGGER' must be the first statement in a query batch

所以在我的情况下,我似乎无法对其进行动态编程。我的整个代码按以下方式工作:

USE DB
GO

CREATE SCHEMA SCH
GO

CREATE TABLE SCH.TABLE
GO

CREATE TRIGGER TRG
GO

所以SCHEMATRIGGER需要作为第一个查询语句,不能这样写

尝试删除 [EventType] [nvarchar](64) NULL, 后的逗号并查看错误消息是否改变。

所以你有两个问题:

  1. 正如@Tanner 所指出的,您不能在动态中使用 GO SQL。
  2. 您在 meta.LogAudit table 列定义中仍然有那个尾随逗号。

试试 运行 这个代码:

DECLARE @dbName NVARCHAR(20) = 'ABC';
declare @sql nvarchar(max) = N'exec '+ @DBName + '..sp_executesql N''CREATE SCHEMA meta'''
execute(@sql)
declare @sql2 nvarchar(max) = '
-- Create Log Table
CREATE TABLE '+ @DBName + '.meta.LogAudit(
[EventDate] [datetime] NOT NULL DEFAULT (getdate()),
[EventType] [nvarchar](64) NULL
)'
exec sp_executesql @sql2,N''

它将允许您以编程方式在指定数据库中创建架构,这与使用当前数据库相反。

您可以在不受支持的未记录存储过程的帮助下使用以下脚本来解决您的需求sp_MSForEachDB

EXEC sp_MSForEachDB '
Use [?]; 
IF ''[?]'' = ''[ABC]'' 
begin
    -- Create Schema
    exec sp_executesql N''CREATE SCHEMA meta''
end
'
EXEC sp_MSForEachDB '
Use [?]; 
IF ''[?]'' = ''[ABC]'' 
begin 
    -- Create Log Table
    CREATE TABLE meta.LogAudit(
    [EventDate] [datetime] NOT NULL DEFAULT (getdate()),
    [EventType] [nvarchar](64) NULL,
    )
end'