Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
hulk77 Member Откуда: Сообщений: 123 |
Добрый день Не уверен, что проблема на стороне SQL Server, но может кто подскажет Есть SQL Server 2016 Выполняется запрос PowerShell, который подключаясь к веб-серверу, возвращает результат в json-строке: $Процедуры = 'Продажи' foreach ($п in $Процедуры) { Clear-Host $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=s; User ID=u; Password=p; Initial Catalog=b; Integrated Security=SSPI") $conn.Open() $Запрос = $П1 + $п + $П2 + $П3 + $П4 $Результат = Invoke-RestMethod $Запрос -Credential $cred -TimeoutSec 6000 $cmd = $conn.CreateCommand() $cmd.CommandText ="INSERT INTO [dbo].[temp_request] ([JSON_string],[mark]) VALUES ('"+ $Результат +"','"+$п+"')" $cmd.ExecuteNonQuery() $conn.Close() } Запрос точно отрабатывает, потому что в файл json записывает. А в SQL Server записывает вот такой странный результат: ?value{Object} И все, значений нет. Более точный набор символов напишу немного позже При чем на втором сервере с точно таким программным пакетом все выполняется правильно: http://prntscr.com/chl0lk Базу преобразовал в 130 Что это за проблема может быть? |
13 сен 16, 19:40 [19661155] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Проблема в генетическом коде. 1. Write-Host "INSERT INTO [dbo].[temp_request] ([JSON_string],[mark]) VALUES ('"+ $Результат +"','"+$п+"')" 2. И ужаснись. |
||
13 сен 16, 19:51 [19661190] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
aleks2, ужаснулся..) http://prntscr.com/chmas3 Так он его и передает в SQL Server.. Но вот такая команда выполняется на втором сервере правильно: $ЗапросСтатьи = 'Выбрать Код Ссылка Из Справочник' $ЗапросСтатьи = $link + $ЗапросСтатьи $a = Invoke-RestMethod $ЗапросСтатьи -Credential $cred -TimeoutSec 600 Clear-Host $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=s; User ID=u; Password=p; Initial Catalog=b; Integrated Security=SSPI") $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText ="INSERT INTO [dbo].[temp_1C_request] ([JSON_string],[mark]) VALUES ('"+ $a +"','Статьи')" $cmd.ExecuteNonQuery() $conn.Close() А как правильно реализовать? Командлет отличается только тем что отправляет не текст запроса а имя хранимой процедуры, и выполняет это по циклу для нескольких хранимых процедур |
13 сен 16, 21:23 [19661417] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Вопрос уже не по теме SQL но если ктото знает, подскажите, пожалуйста Так понимаю что команда складывает все результаты в $Результат, и только после этого переходит к $cmd.ExecuteNonQuery() и выполняет его только раз, а поэтому и не может отправить каждый из результатов отдельными записями в SQL А как нужно сделать, чтобы по циклу записывать в SQL Server отдельно каждый из результатов Invoke-RestMethod ? |
13 сен 16, 22:00 [19661494] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Разберитесь, что возвращают хранимые процедуры, что в итоге кладётся в $Результат. Выведите, что содержится в $Запрос, что возвращает этот Invoke-RestMethod. Очевидно, он возвращает не то, что нужно класть в базу. Поэкспериментируйте с одной процедурой, для примера. И вообще, ваш код - прямой путь к инжекшену и к трудноуловимым багам. Мало ли, что возвращает какой то там веб-сервис, а вы из этого клеите текст, и даёте на выполнение SQL-серверу. Используйте параметризированный запрос. |
||||
14 сен 16, 01:48 [19661888] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Это ДРУГАЯ команда.
Значит он и результатом отличается. Несколько процедур => несколько результатов. Несколько результатов => каждый надо обработать отдельно. |
||||
14 сен 16, 05:52 [19661967] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Спасибо что отозвались Да, действительно запросы разные, и я не прав, что не озвучил это сразу Сделал два выполнения этого запроса - в json-файл и в таблицу SQL Убрал цикл для чистоты эксперимента В файл пишется правильно, в таблицу нет http://prntscr.com/chs2up Записал в хост значение переменной $Результат сразу после выполнения одного запроса (без цикла), и все равно возвращает @{value=System.Object[]} http://prntscr.com/chs4ev Почему тогда в файл пишет все верно?.. |
14 сен 16, 08:15 [19662069] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Напрямую записывать результаты этих хранимых процедут в таблицу SQL Server не удалось Но решено было путем создания json-файла, записи в него результата http-запроса, чтения файла и записи его значений в переменную, а в SQL уже отправляется значение этой переменной Сложновато и не прямым способом, но все равно это не вручную Мложет кому пригодится: foreach ($п in $Процедуры) { $Запрос = $П1 + $п + $П2 + $П3 + $П4 $file = 'C:\BIprojects\exim.json' $a = Invoke-RestMethod $Запрос -Credential $cred -OutFile $file -TimeoutSec 6000 $b = Get-Content -Path $file -Encoding UTF8 $b = $b -replace "'" , "" Clear-Host $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=s; User ID=u; Password=p; Initial Catalog=b; Integrated Security=SSPI") $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText ="INSERT INTO [dbo].[temp_request] ([JSON_string],[mark]) VALUES ('"+ $b +"','"+$п+"')" $cmd.ExecuteNonQuery() $conn.Close() Remove-Item $file } |
14 сен 16, 14:09 [19664141] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
14 сен 16, 16:04 [19665042] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||
14 сен 16, 16:05 [19665045] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Читать мануалы - немодно. Invoke-RestMethod Выходные данные Возвращаемый тип — это тип объектов, возвращаемых командлетом. • System.Xml.XmlDocument, Microsoft.PowerShell.Commands.HtmlWebResponseObject, System.String The output of the cmdlet depends upon the format of the content that is retrieved. • PSObject If the request returns JSON strings, Invoke-RestMethod returns a PSObject that represents the strings. |
||||
14 сен 16, 18:48 [19665820] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
alexeyvg, aleks2 даже после того как выяснил причину, как ее решить способом преобразования в строку все равно не нашел на стаковере есть какие-то монструозные командлеты, но разобраться в них не смог |
14 сен 16, 22:14 [19666389] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Читать про PSObject до просветления. Лучше MSDN. ЗЫ. PSObject = обертка powershell "для всего". Но из нее можно достать "завернутое". |
||
15 сен 16, 08:11 [19666788] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
$Результат = Invoke-RestMethod $Запрос -Credential $cred -TimeoutSec 6000 | ConvertFrom-Json
|
||
16 сен 16, 00:19 [19671175] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Так тоже пробовал Сообщает что не правильная структура JSON-строки |
17 сен 16, 10:26 [19676503] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Вот такой командлетforeach ($п in $Процедуры) { $Запрос = $П1 + $п + $П2 + $П3 + $П4 $a = Invoke-RestMethod $Запрос -Credential $cred -TimeoutSec 6000 | ConvertFrom-Json $b = $a -replace "'" , "" Clear-Host $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=s; User ID=u; Password=p; Initial Catalog=b; Integrated Security=SSPI") $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText ="INSERT INTO [dbo].[temp_1C_request] ([JSON_string],[mark]) VALUES ('"+ $b +"','"+$п+"')" $cmd.ExecuteNonQuery() $conn.Close() } Возвращает пустую ('') строку http://prntscr.com/cizbac |
17 сен 16, 10:38 [19676521] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Неудобно же отлаживать, глядя на конечный результат, мало ли, что там ещё влияет в цепочке. Написали бы Write-Host $a Вы же отлаживаете работу Invoke-RestMethod, powershell и т.д. |
||
17 сен 16, 12:51 [19676674] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Горбатого - могила исправит. Прежде, чем отлаживать - тредстартеру бы программировать подучиться надо. Это даже на говнокод не тянет. $conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=s; User ID=u; Password=p; Initial Catalog=b; Integrated Security=SSPI") $conn.Open() $cmd = $conn.CreateCommand() foreach ($п in $Процедуры) { $Запрос = $П1 + $п + $П2 + $П3 + $П4 $a = Invoke-RestMethod $Запрос -Credential $cred -TimeoutSec 6000 | ConvertFrom-Json $b = $a -replace "'" , "" Clear-Host $cmd.CommandText ="INSERT INTO [dbo].[temp_1C_request] ([JSON_string],[mark]) VALUES ('"+ $b +"','"+$п+"')" $cmd.ExecuteNonQuery() } $conn.Close() |
||||
17 сен 16, 17:15 [19677106] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
alexeyvg, действительно При выполнении такого кода: foreach ($п in $Процедуры) { $Запрос = $П1 + $п + $П2 + $П3 + $П4 $a = Invoke-RestMethod $Запрос -Credential $cred -TimeoutSec 6000 | Out-String | ConvertFrom-Json $b = $a -replace "'" , "" write-host $b } Такая ошибка ConvertFrom-Json : Недопустимый примитив JSON: value. Структура получаемой JSON-строки при парсинге напрямую почему-то считается ошибочной |
20 сен 16, 08:57 [19685913] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
[quot aleks2]
Такой метод реализации на стаковере собрал много лайков) Для моей задачи нужно просто записать результат http-запроса в таблицу SQL На звание программиста PowerShell не претендую ни коем образом :) Если есть возможность подсказать как реализовать более правильным способом - подскажите, буду благодарен |
||
20 сен 16, 13:58 [19687396] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
[quot hulk77]
Ты и на звание "просто программиста" не могешь претендовать. Дык, тибе ж написали. 1. Нехрен открывать 100500 раз в цикле коннект к SQL. 2. Покажи личико, Гульчатай. Т.е. содержимое $Запрос. 3. System.Net.WebRequest тебе в руки. |
||
20 сен 16, 15:26 [19687945] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
aleks2, Спасибо Я нигде не писал что программист. Грубить не было необходимости |
20 сен 16, 20:46 [19689328] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |