Groovy:脚本中的CREATE VIEW失败,“创建视图应该是第一个”

时间:2013-06-25 12:55:20

标签: sql-server tsql groovy

我使用SQL Server Management Studio中的以下SQL脚本在SQL Server数据库中创建视图:

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的轻量级修改:我删除了空行并将多行查询转换为单行查询。

但我想了解我的根本原因。请帮帮我!

提前致谢!

1 个答案:

答案 0 :(得分:0)

我对Groovy一无所知。但是,SQL中的某些命令应该首先出现。其中之一是“创建视图”。 “GO”是批处理分隔符。因此,如果您有多个一次处理的SQL语句,其中一个是“创建视图”,则必须是第一个 - 或者通过“go”与批处理分开。你可能会发现这种武断,但这有很好的理由。在大多数情况下,它通常锁定对象和资源。这是一个讨论https://dba.stackexchange.com/questions/34654/sql-server-must-be-first-statement-in-query-batch-what-and-why原因可能与SQL如何处理各种对象以及需要保持事务之间的一致性等有关。使用MS SQL可以获得许多非常好的东西,但是有一些限制,这就是其中之一。只需要解决它。