#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
Ожидаемый результат от 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, но для этого требуется несколько дополнительных шагов. Однако не беспокойтесь о том, чтобы избежать метасимволов.