выполните powershell из SSMS

#sql #json #powershell #api #ssms

#sql #json #powershell #API #ssms

Вопрос:

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

 declare @url varchar(250) = 'https://samples.openweathermap.org/data/2.5/weather?q=London,ukamp;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,ukamp;appid=439d4b804bc8187953eb36d2a8c26a02'-UseBasicParsing).content  

Powershell

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

Комментарии:

1. Почему вы хотите выполнить его в SSMS в первую очередь?

2. Я пытаюсь получить ответ API в таблице. Я не разработчик C#, и я хотел поиграть с функциями sql server 2019 и json в ssms.

3. Затем отправьте данные на SQL Server. Вызов веб-API-интерфейсов-это не то, для чего предназначен SQL. Используйте другой язык для передачи данных на SQL Server, а затем вы можете использовать их внутри SQL Server.

4. Если вы хотите «поиграть» с JSON в SQL Server, просто получите JSON самостоятельно и вставьте значение в переменную, с которой можно поиграть . Не зацикливайся xp_cmdshell на этом.

5. Обратите внимание, что если вы вставите свою команду в командную строку (которая xp_cmdshell используется), вы получите ту же ошибку .

Ответ №1:

Сообщение об ошибке подразумевает , что ваша командная строка выполняется через cmd.exe , где amp; находится метасимвол.

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

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

При cmd.exe анализе командной строки она распознает ^amp; экранированный amp; символ, который будет использоваться дословно, и удаляет ^ экранирующий символ перед передачей аргумента.

Комментарии:

1. Третий вариант-использовать -EncodedCommand для передачи команды в Base64, но для этого требуется несколько дополнительных шагов. Однако не беспокойтесь о том, чтобы избежать метасимволов.