Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 http запрос через T-SQL  [new]
hulk77
Member

Откуда:
Сообщений: 123
Добрый день
На стороне 1С поднят web-сервис, на PowerShell регулярно выполняются http запросы, и результаты выгружаются в JSON-файлы.

Пример PowerShell запроса:
+
$username = "login"
$password = "password" | ConvertTo-SecureString -asPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username,$password)

$ИБ1 = 'http://10.1.40.61/1C_Bases/hs/getting/login/password/'
$Запросы =
[string]::Concat('ВЫБРАТЬ  ...')

foreach ( in $Запросы)
{
    $Запрос = $ИБ1 + 
	$file =  'C:\1C.json'
	$a = Invoke-RestMethod $Запрос -Credential $cred -OutFile $file -TimeoutSec 600
}


Возникла идея, может возможно отправлять запросы с SQL Server, а результаты выгружать в его таблицы
Нашел в интернете процедуру:
+
CREATE procedure [dbo].[HTTP_Request] ( @sUrl varchar(200))
As
Declare
@obj int
,@hr int
,@msg varchar(255)

 exec @hr = sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
if @hr <> 0 begin Raiserror('sp_OACreate MSXML2.ServerXMLHttp.3.0
failed', 16,1) return end

exec @hr = sp_OAMethod @obj, 'open', NULL, 'GET', @sUrl, false
if @hr <>0 begin set @msg = 'sp_OAMethod Open failed' goto eh end

exec @hr = sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type',
'application/x-www-form-urlencoded'
if @hr <>0 begin set @msg = 'sp_OAMethod setRequestHeader failed' goto
eh end

exec @hr = sp_OAMethod @obj, send, NULL, ''
if @hr <>0 begin set @msg = 'sp_OAMethod Send failed' goto eh end

 exec @hr = sp_OADestroy @obj
return
eh:
exec @hr = sp_OADestroy @obj
Raiserror(@msg, 16, 1)
return
GO


Для выполнения необходима авторизация сервера 1С
Как правильно выполнить эту процедуру с моим запросом, чтобы получить результат выгрузки?
Для примера вписал в @sUrl запрос в методе PowerShell Invoke-RestMethod, чтобы показать всю структуру запроса:

+
USE [AnalysisCRM]
GO

DECLARE    @return_value int

EXEC    @return_value = [dbo].[HTTP_Request]
    @sUrl = N'Invoke-RestMethod http://10.1.40.61/1C_Bases/hs/getting/login/password/ВЫБРАТЬ ... ГДЕ Период >=
 ДАТАВРЕМЯ(2016,08,01) И Период <= ДАТАВРЕМЯ(2016,08,03) -Credential New-Object
 System.Management.Automation.PSCredential(login,password)  -TimeoutSec 600'

SELECT  'Return Value' = @return_value
GO


Буду благодарен за подсказку
16 авг 16, 10:41    [19545772]     Ответить | Цитировать Сообщить модератору
 Re: http запрос через T-SQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8353
Вы должны передать в @sUrl строку, которая формируется в $Запрос. Но эта процедура не обрабатывает результат. Кроме того, на сервере БД потребуется разрешить выполнение OLE, что открывает дыру в безопасности.
16 авг 16, 13:54    [19547248]     Ответить | Цитировать Сообщить модератору
 Re: http запрос через T-SQL  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3990
SQLCLR процедура
16 авг 16, 14:10    [19547356]     Ответить | Цитировать Сообщить модератору
 Re: http запрос через T-SQL  [new]
hulk77
Member

Откуда:
Сообщений: 123
В задаче пошел немного другим путем
Запрос к веб-серверу оставил на PowerShell, но запускать выполнение настроил с SQL Server, и результат запросов вместо JSON отправляю во временную таблицу, с которой через OPENJSON (появился в SQL SERVER 2016) парсится в постоянную таблицу

Не удалось все решить только на уровне T-SQL, но в принципе не проблема поместить PS1 скрипт в папку на сервере

Если кому-то понадобится

Скрипт на PowerShell
$username = "user"
$password = "password" | ConvertTo-SecureString -asPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username,$password)

$link = 'http://10.1.40.61/1C_Bases/hs/getting/user/password/'

$ЗапросСтатьи = 'Выбрать Ссылка КАК Статья  Из Справочник.Статьи'
$ЗапросСтатьи = $link + $ЗапросСтатьи
  $a = Invoke-RestMethod $ЗапросСтатьи -Credential $cred -TimeoutSec 600 

 Clear-Host
$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=SQL; User ID=analuseryst; Password=password; Initial Catalog=Data; 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()



Вот запрос на T-SQL

 -- Запускаю выполнение командлета
EXEC xp_cmdshell 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "C:\PowerShellScript.ps1" -ExecutionPolicy Unrestricted'
GO
 -- Заполнение таблицы Статьи

 DECLARE @JStringsStat nvarchar(MAX)
 SET @JStringsStat =(SELECT [JSON_string] FROM [Data].[dbo].[temp_1C_request] WHERE [mark] = 'Статьи')
 SET @JStringsStat = STUFF(@JStringsStat ,1,1,'') -- в моей строке  вначале не нужный "?"

 TRUNCATE TABLE [Data].[dbo].[Статьи]
 INSERT INTO [Data].[dbo].[Статьи] ([Код],[Статья])
 SELECT код,статья
 FROM OPENJSON (@JStringsStatDDS, '$.value')
 WITH (
        код nvarchar(20), 
        статья nvarchar(100)
 )
16 авг 16, 20:07    [19549488]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить