Я пытаюсь выполнить определенный код xp_cmdshell:

declare @url varchar(250) = 'https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=439d4b804bc8187953eb36d2a8c26a02'
declare @c varchar(1000) = N'powershell.exe -noprofile -executionpolicy bypass '
  + N'-command (Invoke-WebRequest -Uri '''+@url+'''-UseBasicParsing).content'
    print @c
exec xp_cmdshell @c

Но это ошибка, которую я получаю:

The string is missing the terminator: '.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
 
'appid' is not recognized as an internal or external command,
operable program or batch file

Когда я пытаюсь выполнить то же самое в PowerShell, я получаю ожидаемый ответ (см. изображение)

(Invoke-WebRequest -Uri 'https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=439d4b804bc8187953eb36d2a8c26a02'-UseBasicParsing).content

Powershell

Ожидаемый результат от xp_cmdshell должен быть json

1
Dave Pa 26 Ноя 2021 в 23:21
Почему вы вообще хотите запускать его в SSMS?
 – 
Larnu
26 Ноя 2021 в 23:41
Я пытаюсь получить ответ API в виде таблицы. Я не разработчик C # и хотел поиграть с функциями sql server 2019 и json в ssms.
 – 
Dave Pa
26 Ноя 2021 в 23:47
Затем отправьте данные в SQL Server. Вызов веб-API - это не то, для чего предназначен SQL. Используйте другой язык для передачи данных на SQL Server, а затем вы можете использовать их внутри SQL Server.
 – 
Larnu
26 Ноя 2021 в 23:48
Если вы хотите «поиграть» с JSON в SQL Server, просто получите JSON самостоятельно и вставьте значение в переменную, чтобы поиграть с ней. Не запутывайтесь в этом xp_cmdshell.
 – 
Larnu
26 Ноя 2021 в 23:49
Примечание: если вы вставляете команду в командную строку (это то, что использует xp_cmdshell), вы получите ту же ошибку.
 – 
Larnu
26 Ноя 2021 в 23:51

1 ответ

Лучший ответ

Сообщение об ошибке означает, что ваша командная строка выполняется через cmd.exe, где & - это метасимвол .

Чтобы использовать & дословно - в соответствии с вашим намерением - любой URL, частью которого является &, должен быть заключен в "..." (cmd.exe распознает только двойные кавычки) или необходимо ^ - экранировать & :

declare @url varchar(250) = 'https://samples.openweathermap.org/data/2.5/weather?q=London,uk^&appid=439d4b804bc8187953eb36d2a8c26a02'
-- ...

Когда cmd.exe анализирует командную строку, он распознает ^& как экранированный &, который должен использоваться дословно, и удаляет ^, escape-символ, перед тем, как передать аргумент.

0
mklement0 27 Ноя 2021 в 00:12
1
Это отлично сработало! Спасибо за помощь!
 – 
Dave Pa
27 Ноя 2021 в 00:12