Azure SQL数据仓库上的sqlcmd - SqlState 24000,INSERT语句后的游标状态无效

时间:2016-07-15 18:49:12

标签: sqlcmd azure-sqldw

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

INSERT语句完成后,下一个语句失败(但不会结束sqlcmd执行)并带有“warning”

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

GO(注释 - >在脚本中,但不在日志中回显。)

(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(注释 - >在脚本中,但不在日志中回显。)

SqlState 24000, Invalid cursor state

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

谢谢,
符合

答案 1 :(得分:0)

我遇到了类似的问题,在两个陈述之间添加!...isEmpty, case let...帮助了我。

答案 2 :(得分:0)

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