我正在开发一个脚本,用于在连接到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标志。)
我的唯一解决方案是将脚本分成多个部分吗?
答案 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 已经指出的那样,它看起来像是一个驱动程序问题。