2016-12-14 3 views
2

Я использую следующий скрипт:Некорректное Синтаксис 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'. 

Почему это?

-

Edit:
Этот ответ, кажется, отвечая на мой вопрос: 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 

Так, как SCHEMA и TRIGGER должен быть первым оператором запроса, он не может быть написан таким образом.

+0

Возможного дубликата [Execute Dynamic Query с ходом в SQL] (http://stackoverflow.com/ вопросы/14473223/execute-dynamic-query-with-go-in-sql) – Tanner

+2

Вы * можете * запрограммировать его динамически. Просто разделите строки и выполните их отдельно. –

+0

@ Dnac попробуйте динамический sql для создания схемы из моего обновленного ответа ниже. Я уверен, что нечто подобное можно создать и для триггера. Просто проверьте, работает ли создание схемы для вас. – andrews

ответ

2

Попробуйте удалить запятую после [EventType] [nvarchar](64) NULL, и посмотреть, не изменилось ли сообщение об ошибке.

Так у вас есть 2 проблемы:

  1. Как @Tanner указал, вы не можете использовать GO в динамическом SQL.
  2. У вас есть эта конечная запятая в определении столбцов таблицы meta.LogAudit.

Попробуйте запустить этот код:

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

Это позволит программно создать схему в указанной базе данных в противоположности использования текущей базы данных.

+0

. Эта дополнительная запятая, конечно, опечатка, у моей реальной таблицы больше столбцов, я удалил их для создания ситуации бит более ясный. Не знал, что я не должен использовать GO в динамическом SQL. Однако, когда я удаляю его, часть «CREATE SCHEMA» по-прежнему выдает ошибку, поскольку она должна быть первым оператором в пакете запросов. – DNac

+0

@DNac см. Обновленный ответ. Я пробовал его локально против моего db в SQL Server 2008 R2, и он сработал. – andrews

+0

Спасибо. Я переписал свой код таким образом, и он отлично работает. Рад, что я узнал что-то новое. – DNac

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

Проблема OP - это * не * как запустить запрос по нескольким базам данных. Это инструкция 'GO'. –

+0

Я знаю. Вышеупомянутый скрипт избегает выполнения инструкции GO. Использование [?];" помогает устранить ошибки, связанные с GO – Eralper

Смежные вопросы