Почему запрос к базе данных с использованием sqlcmd создает просто пустой файл, в то время как тот же запрос работает в Management Studio?

Недавно я сделал огромный скрипт MSSQL, который работал до тех пор, пока среда сервера не изменилась, и некоторые запросы больше не разрешены. Поэтому мне пришлось создать файл .bat, который выполняет этот запрос из командной строки.

Я не получаю никакой ошибки или чего-то еще. Я просто получаю файл без записи. Но я получаю много записей, если использую код запроса в Management Studio.

Кто-нибудь видит, где ошибка в моей командной строке?

Я вставил несколько новых строк для лучшего чтения кода. Все, кроме команды PAUSE, находится в одной строке командного файла.

РЕДАКТИРОВАТЬ: я понял, что проблема в последнем предложении WHERE в операторе LIKE. Если я уберу оператора LIKE, он сработает. Это не имеет ничего общего с символом %. эффективен оператор LIKE. Кто-нибудь знает, как это исправить?

sqlcmd -S connection\string -U user -P password -d dbName -s";" -Q "SET NOCOUNT ON; 
SELECT [per_nummer] as EmployeeID, 
[per_id] as System_nr, 
[per_pid] as PID, 
[per_anrede] as Gender, 
[per_vname] as Vorname, 
[per_name] as Name, 
[per_telEx] as Telefon, 
[per_email] as Email, 
[per_instradierungHauptort] as Instradierung, 
[per_gebnr] as Gebaeudenummer, 
(SELECT mobileTelephoneNumber FROM [dbName].[dbo].[import_zuko_GLDAP_DUMP] WHERE UserID = per_pid ) as Mobile, 
[per_business_area] as Business_Area, 
(SELECT csgdivision FROM [dbName].[dbo].[import_zuko_GLDAP_DUMP] WHERE UserID = per_pid ) as Division,
NULL as Bereich, 
(SELECT csgCompany FROM [dbName].[dbo].[import_zuko_GLDAP_DUMP] WHERE UserID = per_pid ) as Firma,
[per_sprache] as Korespondenzsprache,
(SELECT roomnumber FROM [dbName].[dbo].[import_zuko_GLDAP_DUMP] WHERE UserID = per_pid ) as Bueronummer,
[per_floor] as Etage,
(SELECT convert(varchar, convert(date,[per_eintrittsdatum]), 104)) as Eintritt_per,
(SELECT convert(varchar, convert(date,[per_austrittsdatum]), 104)) as Austritt_per,
CONVERT(VARCHAR(10), GETDATE(), 104) AS letzte_mutation,
per_lm as Linemanager,
(SELECT TOP 1 per_pid FROM [dbName].[dbo].[person] WHERE per_nummer = master_table.per_lm) AS lm_pid,
(SELECT convert(varchar, convert(date,[per_lm_von]), 104)) as lm_von,
(SELECT convert(varchar, convert(date,[per_lm_bis]), 104)) as lm_bis,
NULL FROM [dbName].[dbo].[person] as master_table
WHERE
[per_nummer] IS NOT NULL AND per_pidStatus = 'A' AND
([per_pid] LIKE('A%')OR [per_pid] LIKE('F%')OR [per_pid] LIKE('W%'))"
-w 1000 -W  -o "\\servername\G$\path\to\file.csv"
PAUSE

person loonybin    schedule 12.07.2014    source источник


Ответы (1)


Различные параметры по умолчанию

Вы внимательно прочитали документацию Microsoft по sqlcmd?

Вверху находится важная информация:

Поскольку могут применяться разные параметры по умолчанию, вы можете увидеть различное поведение при выполнении одного и того же запроса в SQL Server Management Studio в режиме SQLCMD и в утилите sqlcmd.

Поэтому пустой файл может быть вызван различными параметрами по умолчанию.

Пробел между опцией и значением опции

Далее документация вверху содержит:

В настоящее время sqlcmd не требует пробела между параметром командной строки и значением. Однако в будущем выпуске может потребоваться пробел между параметром командной строки и значением.

Двойные кавычки внутри строки аргумента часто вызывают проблемы, см. ответ на Почему двойные кавычки всегда должны быть только в начале и конце строки аргумента?< /а>

Поэтому я предлагаю последовать совету Microsoft и изменить -s";" на -s ";" с пробелом после -s, как и для всех других вариантов.

Экранирование знака процента

Вы пытались избежать каждого % в строке запроса дополнительным % и, следовательно, использовать 3 раза %% в строке запроса?

Интерпретатор командной строки cmd.exe может интерпретировать строку между двумя % как ссылку на переменную среды, а поскольку такой переменной среды нет, он удаляет все, что находится между двумя %, из командной строки.

Обновление: оказалось, что действительно не экранированные знаки процента привели к неправильной строке запроса и, следовательно, к пустому файлу результатов.

Команда с путем и расширением

Общий совет:
Всегда рекомендуется указывать в пакетных файлах такие команды, как sqlcmd, с полным именем, то есть с путем и расширением файла, так как это делает выполнение приложения независимым от значений среды. переменные PATH и PATHEXT.

person Mofi    schedule 12.07.2014
comment
Спасибо Мофи за ответ. Я внес все изменения и внимательно читал документацию. ничего не изменилось в ситуации. после этого я шаг за шагом продвигался по коду. На самом деле проблема заключается в операторе LIKE в предложении WHERE. Поэтому, если я скажу, где per_pid = 'abcdefg', это сработает, но когда я изменю его на WHERE per_pid LIKE('abcdegf'), это не сработает даже с %. У вас есть идеи, как решить эту проблему? - person loonybin; 13.07.2014
comment
В этом и был смысл двойного ‹code›%%‹/code›. спасибо Мофи за помощь - person loonybin; 13.07.2014