sqlcmd в хранилище данных SQL Azure — SqlState 24000, недопустимое состояние курсора после инструкции INSERT

Я работаю над сценарием для перезагрузки таблицы с помощью SQLCMD в Linux, подключающемся к базе данных хранилища данных SQL Azure.

После завершения инструкции 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 не закрывает курсор, а затем последующие команды получают предупреждение, которое действительно следует считать ошибкой и завершать выполнение. (У меня включен флаг -b при вызове sqlcmd.)

Является ли мое единственное решение разбить сценарий на несколько частей?


person Steve    schedule 15.07.2016    source источник
comment
Я поднял SR по этому поводу, и мне сообщили, что это известная ошибка.   -  person Steve    schedule 18.02.2017
comment
вы можете попробовать сделать то же самое с msqlcli, загрузив его отсюда, и посмотрите, появляется ли та же ошибка: blogs.technet.microsoft.com/dataplatforminsider/2017/12/12/   -  person TheGameiswar    schedule 15.12.2017


Ответы (3)


похоже, это проблема с драйвером ODBC, который используется sqlcmd под капотом. Можете ли вы подтвердить, что вы видите эту проблему с базой данных SQL Azure? Также было бы хорошо увидеть ваши файлы odbc.ini и odbcinst.ini. Можете ли вы поделиться ими?

А пока я хотел бы порекомендовать пару очень крутых инструментов командной строки Node.js, которые больше подходят для сред Linux и Mac:
SQL-CLI
Cheetah

Спасибо,
До встречи

person meet-bhagdev    schedule 20.07.2016

Я столкнулся с подобной проблемой, и мне помогло добавление GO между двумя утверждениями.

person Akshay    schedule 15.12.2016
comment
Каждое из моих утверждений имеет GO. Необходимо вернуться к этому и посмотреть, присутствует ли все еще использование драйвера ODBC SQL Server V13 для Linux. Я использовал v11. - person Steve; 16.12.2016
comment
Только что снова столкнулся с ошибкой, используя драйвер ODBC SQL Server V13 для Linux. Проблема воспроизводима. Если INSERT/SELECT загружает нулевые строки, последующий SELECT получает SqlState 24000, недопустимое состояние курсора. - person Steve; 16.02.2017

У нас была такая же проблема. При выполнении INSERT через SELECT это привело к ответу (0 rows affected) и ошибке invalid cursor state. Нам помогло добавление SET NOCOUNT ON в начале скрипта. Как уже указал @meet-bhagdev, это похоже на проблему с драйвером.

person Ben Watt    schedule 23.04.2021