2013-06-25 2 views
1

я создавать представления в SQL Server БД со следующего сценария SQL из SQL Server Management Studio:Groovy: CREATE VIEW из скрипта терпит неудачу с 'создать вид должен быть первым'

use DB_1 
go 

if exists (select * from sysobjects where name='view_name' and xtype='V') 
    drop view view_name 
go 

create view view_name as (
select l.* from table_name l join (select col_1, col_2 from table_name group by col_2, col_1 having col_1=max(col_1)) m on (l.col_2=m.col_2and l.col_1 = m.col_1) 
) 
go 

use DB_2 
go 

if exists (select * from sysobjects where name='view_name' and xtype='V') 
    drop view view_name 
go 

create view view_name as (
select l.* from table_name l join (select col_1, col_2 from table_name group by col_2, col_1 having col_1=max(col_1)) m on (l.col_2=m.col_2 and l.col_1 = m.col_1) 
) 
go 

if exists (select * from sysobjects where name='view_name_2' and xtype='V') 
drop view view_name_2 
go 


create view view_name_2 as (
select l.* from table_name_2 l join (select col_1, col_2 from table_name_2 group by col_2, col_1 having col_1=max(col_1)) m on (l.col_2=m.col_2 and l.col_1 = m.col_1) 
) 
go 

У меня есть некоторые Groovy сценарии для выполнения другие SQL-скрипты, так что я просто пытался выполнить этот в полной аналогии с другими:

Sql.withInstance(...connection_params...){ 
    it.execute((new File('Script.sql')).text) 
} 

Где Script.sql является SQL-запрос упоминалось выше, с небольшими изменениями (без заявлений «Go»).

Я получаю следующее сообщение об ошибке для этого Groovy сценария во время выполнения:

... create view should be the first in query batch ... 

Я не понимаю эту ошибку. Что я должен исправить в сценарии для выполнения этого?

Я попытался создать обходные пути и получил следующие один рабочий для меня:

Sql.withInstance(...connection_params...){ oSQL -> 
     (new File('Script_2.sql')).eachLine{ oSQL.execute(it) } 
    } 

Где Script_2.sql является легкой модификацией Script.sql: Я удалил пустые строки и преобразование многострочных запросов к одной линии из них ,

Но я хочу понять свою первопричину. Пожалуйста, помогите мне в этом!

Спасибо заранее!

ответ

0

Я ничего не знаю о Groovy. Однако в SQL есть определенные команды, которые должны произойти в первую очередь. Одним из них является «create view». «GO» - это разделитель партий. Поэтому, если у вас есть несколько операторов SQL, которые вы обрабатываете за один раз, а один из них - «создать представление», он должен быть первым - или отделен от партии «go». Вы можете найти это произвольным, однако есть веские причины. В большинстве случаев его блокировка объектов и ресурсов в целом. Вот обсуждение https://dba.stackexchange.com/questions/34654/sql-server-must-be-first-statement-in-query-batch-what-and-why Причина, вероятно, связана с тем, как SQL обрабатывает различные объекты и требует поддержания согласованности между транзакциями и т. П. Вы получаете много очень хороших вещей с MS SQL, но есть некоторые ограничения, и это один из них. Просто нужно обойти это.

+0

Ian, Спасибо! Понял! В моем обходном пути я вызываю заявления один раз. И я не могу запустить скрипт с GO из Groovy. Итак, похоже, это не моя проблема. Просто правило MS SQL Server. – zubactik

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