GO,T-SQL EXEC()

时间:2016-12-14 11:44:07

标签: sql-server sql-server-2016 dynamicquery

我使用以下脚本:

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需要是第一个查询语句,所以不能用这种方式编写。

2 个答案:

答案 0 :(得分:2)

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

所以你有两个问题:

  1. 正如@Tanner指出的那样,你不能在动态SQL中使用GO。
  2. meta.LogAudit表格列定义中仍有逗号逗号。
  3. 尝试运行此代码:

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

    它允许您以编程方式在指定的数据库中创建与使用当前数据库相反的模式。

答案 1 :(得分:-1)

您可以使用以下脚本在不受支持的未记录的存储过程的帮助下解决您的需求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'