我使用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的轻量级修改:我删除了空行并将多行查询转换为单行查询。
但我想了解我的根本原因。请帮帮我!
提前致谢!
答案 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可以获得许多非常好的东西,但是有一些限制,这就是其中之一。只需要解决它。