Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
aleks2
Guest
hulk77
А в SQL Server записывает вот такой странный результат:
?value{Object}
И все, значений нет. Более точный набор символов напишу немного позже

При чем на втором сервере с точно таким программным пакетом все выполняется правильно:
http://prntscr.com/chl0lk

Базу преобразовал в 130

Что это за проблема может быть?


Проблема в генетическом коде.
1. Write-Host "INSERT INTO [dbo].[temp_request] ([JSON_string],[mark]) VALUES ('"+ $Результат +"','"+$п+"')"
2. И ужаснись.
13 сен 16, 19:51    [19661190]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
hulk77
Member

Откуда:
Сообщений: 123
Вопрос уже не по теме SQL но если ктото знает, подскажите, пожалуйста

Так понимаю что команда складывает все результаты в $Результат, и только после этого переходит к $cmd.ExecuteNonQuery() и выполняет его только раз, а поэтому и не может отправить каждый из результатов отдельными записями в SQL

А как нужно сделать, чтобы по циклу записывать в SQL Server отдельно каждый из результатов Invoke-RestMethod ?
13 сен 16, 22:00    [19661494]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
hulk77
А как нужно сделать, чтобы по циклу записывать в SQL Server отдельно каждый из результатов Invoke-RestMethod ?
Ну, наверное, в $Результат попадает коллекция? Тогда сделайте foreach по $Результат
hulk77
Так понимаю что команда складывает все результаты в $Результат
В $Результат попадает результат выполнения одной хранимой процедуры (очередной из выбранных в списке), и потом вы этот $Результат подставляете как текст в определённое место запроса.

Разберитесь, что возвращают хранимые процедуры, что в итоге кладётся в $Результат. Выведите, что содержится в $Запрос, что возвращает этот Invoke-RestMethod. Очевидно, он возвращает не то, что нужно класть в базу. Поэкспериментируйте с одной процедурой, для примера.

И вообще, ваш код - прямой путь к инжекшену и к трудноуловимым багам. Мало ли, что возвращает какой то там веб-сервис, а вы из этого клеите текст, и даёте на выполнение SQL-серверу.
Используйте параметризированный запрос.
14 сен 16, 01:48    [19661888]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
aleks2
Guest
hulk77
Но вот такая команда выполняется на втором сервере правильно:

Это ДРУГАЯ команда.

hulk77
А как правильно реализовать? Командлет отличается только тем что отправляет не текст запроса а имя хранимой процедуры, и выполняет это по циклу для нескольких хранимых процедур


Значит он и результатом отличается. Несколько процедур => несколько результатов.
Несколько результатов => каждый надо обработать отдельно.
14 сен 16, 05:52    [19661967]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
hulk77
Member

Откуда:
Сообщений: 123
Спасибо что отозвались

Да, действительно запросы разные, и я не прав, что не озвучил это сразу

Сделал два выполнения этого запроса - в json-файл и в таблицу SQL
Убрал цикл для чистоты эксперимента
В файл пишется правильно, в таблицу нет

http://prntscr.com/chs2up

Записал в хост значение переменной $Результат сразу после выполнения одного запроса (без цикла), и все равно возвращает @{value=System.Object[]}

http://prntscr.com/chs4ev

Почему тогда в файл пишет все верно?..
14 сен 16, 08:15    [19662069]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
hulk77
В файл пишется правильно, в таблицу нет

http://prntscr.com/chs2up

Записал в хост значение переменной $Результат сразу после выполнения одного запроса (без цикла), и все равно возвращает @{value=System.Object[]}

http://prntscr.com/chs4ev

Почему тогда в файл пишет все верно?..
Ну, в $Результат пишется объект; видимо, преобразование его в строку при выводе не есть тот же самое, что и запись в файл опцией -OutFile
14 сен 16, 16:04    [19665042]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
hulk77
Напрямую записывать результаты этих хранимых процедут в таблицу SQL Server не удалось
Нужно поизучать объект $Результат, что там вообще записано, из чего он состоит
14 сен 16, 16:05    [19665045]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
aleks2
Guest
alexeyvg
hulk77
Напрямую записывать результаты этих хранимых процедут в таблицу SQL Server не удалось
Нужно поизучать объект $Результат, что там вообще записано, из чего он состоит


Читать мануалы - немодно.
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
hulk77
Member

Откуда:
Сообщений: 123
alexeyvg, aleks2

даже после того как выяснил причину, как ее решить способом преобразования в строку все равно не нашел
на стаковере есть какие-то монструозные командлеты, но разобраться в них не смог
14 сен 16, 22:14    [19666389]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
aleks2
Guest
hulk77
alexeyvg, aleks2

даже после того как выяснил причину, как ее решить способом преобразования в строку все равно не нашел
на стаковере есть какие-то монструозные командлеты, но разобраться в них не смог


Читать про PSObject до просветления. Лучше MSDN.

ЗЫ. PSObject = обертка powershell "для всего". Но из нее можно достать "завернутое".
15 сен 16, 08:11    [19666788]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
hulk77
даже после того как выяснил причину, как ее решить способом преобразования в строку все равно не нашел
А так не помогает?
$Результат = Invoke-RestMethod $Запрос -Credential $cred -TimeoutSec 6000 | ConvertFrom-Json
16 сен 16, 00:19    [19671175]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
hulk77
Member

Откуда:
Сообщений: 123
Так тоже пробовал
Сообщает что не правильная структура JSON-строки
17 сен 16, 10:26    [19676503]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
hulk77
Вот такой командлет
...
Возвращает пустую ('') строку
У вас не очень оптимальный способ отладки.
Неудобно же отлаживать, глядя на конечный результат, мало ли, что там ещё влияет в цепочке.
Написали бы Write-Host $a
Вы же отлаживаете работу Invoke-RestMethod, powershell и т.д.
17 сен 16, 12:51    [19676674]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
aleks2
Guest
alexeyvg
hulk77
Вот такой командлет
...
Возвращает пустую ('') строку
У вас не очень оптимальный способ отладки.
Неудобно же отлаживать, глядя на конечный результат, мало ли, что там ещё влияет в цепочке.
Написали бы Write-Host $a
Вы же отлаживаете работу Invoke-RestMethod, powershell и т.д.


Горбатого - могила исправит.

Прежде, чем отлаживать - тредстартеру бы программировать подучиться надо.
Это даже на говнокод не тянет.

$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]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
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.
+ ... | Out-String | ConvertFrom-Json

Структура получаемой JSON-строки при парсинге напрямую почему-то считается ошибочной
20 сен 16, 08:57    [19685913]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
hulk77
Member

Откуда:
Сообщений: 123
[quot aleks2]
alexeyvg
пропущено...

Это даже на говнокод не тянет.


Такой метод реализации на стаковере собрал много лайков)
Для моей задачи нужно просто записать результат http-запроса в таблицу SQL
На звание программиста PowerShell не претендую ни коем образом :)

Если есть возможность подсказать как реализовать более правильным способом - подскажите, буду благодарен
20 сен 16, 13:58    [19687396]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
aleks2
Guest
[quot hulk77]
aleks2
пропущено...


Такой метод реализации на стаковере собрал много лайков)
Для моей задачи нужно просто записать результат http-запроса в таблицу SQL
На звание программиста PowerShell не претендую ни коем образом :)

Если есть возможность подсказать как реализовать более правильным способом - подскажите, буду благодарен


Ты и на звание "просто программиста" не могешь претендовать.

Дык, тибе ж написали.

1. Нехрен открывать 100500 раз в цикле коннект к SQL.
2. Покажи личико, Гульчатай. Т.е. содержимое $Запрос.
3. System.Net.WebRequest тебе в руки.
20 сен 16, 15:26    [19687945]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при записи результата запроса с PowerShell в таблицу SQL Server  [new]
hulk77
Member

Откуда:
Сообщений: 123
aleks2,

Спасибо

Я нигде не писал что программист. Грубить не было необходимости
20 сен 16, 20:46    [19689328]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить