【问题标题】:Running MS SQL script with batch separators in Ruby/DBI?在 Ruby/DBI 中运行带有批处理分隔符的 MS SQL 脚本?
【发布时间】:2014-04-20 02:10:40
【问题描述】:

我正在尝试从可能包含批处理分隔符(GO 关键字)的 Ruby/DBI 文件中运行 MS SQL 脚本。整个脚本被包装在一个事务中,因此脚本中的任何错误都会导致回滚.

  scriptContents = File.read(@path)
  SqlDb.conn['AutoCommit'] = false
  begin
    SqlDb.conn.do scriptContents
    SqlDb.conn.commit
  rescue Exception
    SqlDb.conn.rollback
    @@log.error "Executing #{@path} resulted in error.  Transaction has been rolled back: #{$!}"
  end
  SqlDb.conn['AutoCommit'] = true

执行一个包含GO的简单脚本,如:

PRINT 'this script is pointless'
GO
SELECT 1

导致以下错误:

ERROR SqlUpgradeScript : 执行 test/noop.sql 导致错误。事务已回滚:37000 (102) [Microsoft][ODBC SQL Server Driver][SQL Server]'GO' 附近的语法不正确。

删除GO 会导致脚本成功运行。

使用 Ruby/DBI 运行可能包含多个批处理的 SQL 脚本,同时仍将整个脚本作为单个事务运行的最简洁方法是什么?

【问题讨论】:

    标签: ruby sql-server dbi


    【解决方案1】:

    GO 不是 T-SQL 语句。它是一个控制台命令,仅由 SQL Server Management Studio(或命令行等效项 isq;/osql)用于分隔脚本文件中的批处理。

    您发送到 SQL Server 的任何命令文本都被视为单个批处理。请记住,当调用.do 时,您正在向服务器发送命令,而不是向控制台发送脚本文件。

    在某些情况下,您可能必须使用分号 (;) 分隔多个语句,例如使用 CTE (WITH () .... SELECT...) 时,否则无需使用任何分隔符。

    只需删除GO 并将您想要的命令发送到服务器。如果您确实想要执行脚本文件,则必须在代码中将它们分批拆分,然后将每个批次作为单个命令发送。

    【讨论】:

      猜你喜欢
      • 2014-06-14
      • 2013-07-30
      • 2011-06-15
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2017-05-07
      相关资源
      最近更新 更多