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

Откуда: (((@)))
Сообщений: 8565
Подскажите, пожалуйста, научился ли MSSQL Server самостоятельно получать JSON от ресурса? Если да, то где почитать.

Суть вопроса: хочу попробовать исключительно средствами MS SQL Server работать со внешним ресурсом посредством JSON (http|https, авторизация либо в заголовке либо в теле запросов). Ну что бы в процедуре можно было отправлять json-запрос на внешний ресурс и ловить ответ ответ и обрабатывать его...

Если кому-то удалось, напишите, пожалуйста, простенький пример.

Тут 7485552 читал (но у поста на днях десятилетний юбилей), а это мне как-то не помогло :(

Заранее спасибо!

--------------------------
No ROM Basic...
28 июл 19, 15:35    [21936230]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
Освойте уже CLR. А еще лучше нормальную очередь поставьте.
Откуда это неугомонное желание именно из процедуры?...
28 июл 19, 16:01    [21936242]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Гавриленко Сергей Алексеевич
Освойте уже CLR. А еще лучше нормальную очередь поставьте.
Откуда это неугомонное желание именно из процедуры?...

Если JSOn уж четыре года "как прикрутили", может и механизм появился. А если механизм есть, то зачем изобретать велосипед?
28 июл 19, 18:13    [21936286]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
SIMPLicity_,

А, типа, когда блобы в сервер добавляли, должны были и медиа-проигрыватель для видосиков вставить?
28 июл 19, 18:48    [21936299]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
vikkiv
Member

Откуда: London
Сообщений: 2498
SIMPLicity_
..Если JSOn уж четыре года "как прикрутили", может и механизм появился...
Работа с форматом JSON и взаимодействие с внешними системами - это концептуально довольно разные вещи.
28 июл 19, 19:59    [21936321]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29558
SIMPLicity_
Гавриленко Сергей Алексеевич
Освойте уже CLR. А еще лучше нормальную очередь поставьте.
Откуда это неугомонное желание именно из процедуры?...

Если JSOn уж четыре года "как прикрутили", может и механизм появился. А если механизм есть, то зачем изобретать велосипед?
Хранение данных в формате money ещё раньше притулили, но курсы обмена из ЦБ сиквел получать не умеет. И карты из Гугла не умеет, хотя геоданные тоже добавили.
Всё таки обработка JSON, и импорт данных из интернета - разные вещи. Как минимум, это может быть в сиквельном средстве ETL (то есть в SSIS), но уж точно не в T-SQL
29 июл 19, 00:13    [21936492]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
andy st
Member

Откуда:
Сообщений: 769
SIMPLicity_,
без авторизации - как-то так
авторизация - отдельный глум, зависимый от источника данных
declare @obj int, @ret  int, @json varchar(max), @url varchar(max)
set @url = 'http://...'

exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @obj out
IF @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'Open', null, 'GET', @url, 'false'
if @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
if @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'setOption', null, 2 ,13056  -- игнорировать сертификат
if @ret <> 0 exec sp_OAGetErrorInfo @obj

EXEC @ret = sp_OAMethod @obj, 'SEND'
if @ret <> 0 exec sp_OAGetErrorInfo @obj
declare  @httpresult table (http varchar(max))

insert @httpresult EXEC @ret = sp_OAGetProperty @obj, 'responsetext'
IF @ret<>0 
EXEC sp_OAGetErrorInfo @obj

SELECT @json = http from @httpresult
select @json

EXEC @ret = sp_OADestroy @obj
29 июл 19, 05:54    [21936538]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
andy st
SIMPLicity_,
без авторизации - как-то так
авторизация - отдельный глум, зависимый от источника данных
declare @obj int, @ret  int, @json varchar(max), @url varchar(max)
set @url = 'http://...'

exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @obj out
IF @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'Open', null, 'GET', @url, 'false'
if @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'setRequestHeader', null, 'Content-Type', 'text/xml; charset=utf-8'
if @ret <> 0 exec sp_OAGetErrorInfo @obj

exec @ret = sp_OAMethod @obj, 'setOption', null, 2 ,13056  -- игнорировать сертификат
if @ret <> 0 exec sp_OAGetErrorInfo @obj

EXEC @ret = sp_OAMethod @obj, 'SEND'
if @ret <> 0 exec sp_OAGetErrorInfo @obj
declare  @httpresult table (http varchar(max))

insert @httpresult EXEC @ret = sp_OAGetProperty @obj, 'responsetext'
IF @ret<>0 
EXEC sp_OAGetErrorInfo @obj

SELECT @json = http from @httpresult
select @json

EXEC @ret = sp_OADestroy @obj


Спасибо большое! Похожее видел. "Взял на карандашик" как вариант.
29 июл 19, 09:46    [21936596]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Гавриленко Сергей Алексеевич
SIMPLicity_,

А, типа, когда блобы в сервер добавляли, должны были и медиа-проигрыватель для видосиков вставить?

Так ведь сделали. Ну, не в прямом смысле слова, но...
29 июл 19, 09:47    [21936597]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Гавриленко Сергей Алексеевич
Освойте уже CLR. А еще лучше нормальную очередь поставьте.
Откуда это неугомонное желание именно из процедуры?...

Длина ПЕРЕДАВАЕМОЙ в CLR строки - 8000 байт (8000 символов для varchar и 4000 для Nvarchar).
CLR может возвращать в качестве результата (return) только int32 (код возврата).
Это для C# и MSSQL2017E ...
---------------------------------------
Итог: всё равно приходится фигачиться с таблицами
31 июл 19, 18:36    [21939228]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
Владислав Колосов
Member

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

В курсе, что через sp_OACreate можно винт отформатировать? Никогда не включайте на корпоративном сервере OLE.
1 авг 19, 01:10    [21939378]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
Владислав Колосов
Member

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

автор
CLR может возвращать в качестве результата (return) только int32 (код возврата)

Вы это насочиняли.
1 авг 19, 01:17    [21939379]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6954
SIMPLicity_
Длина ПЕРЕДАВАЕМОЙ в CLR строки - 8000 байт (8000 символов для varchar и 4000 для Nvarchar).


Об этом тоже насочиняли.

Для функций CLR допустимы все типы данных, включая определяемые пользователем типы данных CLR, за исключением типов данных text, ntext, image, определяемых пользователем табличных типов и типов данных timestamp.
1 авг 19, 01:25    [21939380]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Владислав Колосов
SIMPLicity_,

автор
CLR может возвращать в качестве результата (return) только int32 (код возврата)

Вы это насочиняли.

Где насочинял?

C# :

...
public static string GetFromSite(SqlString connectionString)
{
//string string_ = connectionString.ToString();
//connectionString = string_.ToString().Length.ToString() + " > " +connectionString.ToString().ToLower();
return connectionString;
// string string_ = connectionString.ToString();
// return connectionString.ToString().Length * -1 ;
}
...

Компилирую для FW 4.0
Регистрирую assembly.
Строю процедуру и получаю отлуп: Ошибка CREATE PROCEDURE: процедура среды CLR может определяться только для методов, возвращающих один из следующих типов: , SqlInt32, System.Int32, System.Nullable<System.Int32>, void.

MSSQL2017 Express (последний).

Насчёт функции,- да, там можно (вероятно) хоть что угодно.
1 авг 19, 01:50    [21939382]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Была идея сделать нечто красивое, НО...
Нашёл вот это: CLR для работы с контентом: HTTP Requests Using SQLCLR (by
Eilert Hjelmeseth, 2018-10-11)
.

Не всё сразу, но работает вроде.

Если кому интересно - могу попробовать как-нибудь накатать перевод и обзор.
Перекомпилировать dll пока не стал,- возможно, со временем перековыряю кусок под себя. Если будут у кого-то существенные правки и замечания,- пишите, пожалуйста, сюда. На всякий случай - ClrHttpRequest.zip (ссылка на оригинал - на оригинальной странице).
1 авг 19, 02:33    [21939386]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Владислав Колосов
SIMPLicity_
Длина ПЕРЕДАВАЕМОЙ в CLR строки - 8000 байт (8000 символов для varchar и 4000 для Nvarchar).


Об этом тоже насочиняли.

Для функций CLR допустимы все типы данных, включая определяемые пользователем типы данных CLR, за исключением типов данных text, ntext, image, определяемых пользователем табличных типов и типов данных timestamp.

Ухты!
Честно использовал SqlString. Больше 8000 байт передать в CLR не смог.
1 авг 19, 02:42    [21939387]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29558
SIMPLicity_
Ухты!
Честно использовал SqlString. Больше 8000 байт передать в CLR не смог. Картинка с другого сайта.
Вот, в доке написано:

Handling Large Object (LOB) Parameters in the CLR
Use SqlBytes and SqlChars to pass large object (LOB) binary type (varbinary(max)) and LOB character type (nvarchar(max)) parameters, respectively. These types allow streaming the LOB values from the database to the common language runtime (CLR) routine, instead of copying the entire value into managed space. SqlBinary and SqlString should be used only for small binary and character string values.

Кроме того, SqlChars сиквел передаёт и возвращает быстрее, чем SqlString, поэтому лучше использовать его в любом случае, если только не предполагается сложной обработки строк.
1 авг 19, 07:48    [21939432]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
Владислав Колосов
Member

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

А почему вы используете процедуры там, где лучше использовать функции?
Например, можно легко организовать массовую обработку набора данных, используя выражение SELECT вместо цикла и результат этой обработки возвращать в таблицу. При этом режим безопасности будет SAFE, т.к. не придется выполнять подключение к серверу.

Решений, при которых _нельзя_ использовать CLR функции не так уж и много.
1 авг 19, 12:06    [21939712]     Ответить | Цитировать Сообщить модератору
 Re: Как получить JSON от ресурса средствами самого MS SQL Server  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8565
Владислав Колосов
SIMPLicity_,

А почему вы используете процедуры там, где лучше использовать функции?
Например, можно легко организовать массовую обработку набора данных, используя выражение SELECT вместо цикла и результат этой обработки возвращать в таблицу. При этом режим безопасности будет SAFE, т.к. не придется выполнять подключение к серверу.

Решений, при которых _нельзя_ использовать CLR функции не так уж и много.


Я образумился, господин судья! Больше так не буду!
См. выше на три поста ,- пока буду пользоваться найденным решением. Потом допилю. Нагрузка пока небольшая,- будет работать неспешно и надёжно...
1 авг 19, 20:53    [21940192]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить