【问题标题】:sqlcmd on Azure SQL Data Warehouse - SqlState 24000, Invalid cursor state after INSERT statementAzure SQL 数据仓库上的 sqlcmd - SqlState 24000,INSERT 语句后游标状态无效
【发布时间】:2016-11-19 02:00:45
【问题描述】:

我正在编写一个脚本,以在 Linux 上使用 SQLCMD 重新加载表,连接到 Azure SQL 数据仓库数据库。

INSERT 语句完成后,下一条语句失败(但不会结束 sqlcmd 执行)并显示“警告”

insert into
  schema.table_temp
(
 ...list of columns
)
select
 ...list of columns
from
   schema.table
;

GO(COMMENT--> 在脚本中,但未在日志中回显。)

(0 rows affected)   

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES t WHERE TABLE_TYPE = 'BASE TABLE' and TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table_nox' )
 DROP TABLE schema.table_nox
;

GO(COMMENT--> 在脚本中,但未在日志中回显。)

SqlState 24000, Invalid cursor state

脚本继续运行,每个后续批次都相同 SqlState 24000,游标状态“警告”无效

如果我注释掉 INSERT 语句,脚本会按预期运行而不会发出警告。我推测 INSERT 语句没有关闭游标,然后后续命令会收到警告,这应该被视为错误并结束执行。 (我在 sqlcmd 调用中打开了 -b 标志。)

将脚本分成多个部分是我唯一的解决方案吗?

【问题讨论】:

标签: sqlcmd azure-sqldw


【解决方案1】:

这似乎是 sqlcmd 在后台使用的 ODBC 驱动程序的问题。您能否确认您是否在 Azure SQL DB 中看到此问题?最好能看到您的 odbc.ini 和 odbcinst.ini 文件。可以分享一下吗?

同时,我想推荐几个非常酷的 Node.js 命令行工具,它们更适合 Linux 和 Mac 环境:
SQL-CLI
Cheetah

谢谢,
见面

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,在两个语句之间添加 GO 对我有帮助。

    【讨论】:

    • 我的每一条语句都有一个GO。需要重新访问,看看是否仍然存在使用 Linux 的 V13 SQL Server ODBC 驱动程序。我使用的是 v11。
    • 刚刚使用适用于 Linux 的 V13 SQL Server ODBC 驱动程序再次遇到错误。问题是可重现的。如果 INSERT/SELECT 加载零行,则后续 SELECT 将获取“SqlState 24000, Invalid cursor state”。
    【解决方案3】:

    我们遇到了同样的问题。通过SELECT 执行INSERT 时,会导致(0 rows affected) 响应和invalid cursor state 错误。在脚本开头添加SET NOCOUNT ON 对我们有用。正如@meet-bhagdev 已经指出的那样,这看起来像是驱动程序问题。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多