Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выполнение Python-скрипта в скалярной функции / 13 сообщений из 13, страница 1 из 1
25.07.2021, 17:03
    #40086067
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
Добрый день

Пытаюсь написать скрипт функции, возвращающий скалярное значение


Есть код процедуры, который работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE PROCEDURE [dbo].[p_proc] 
(
	@EMAIL NVARCHAR(50)
)

AS

DECLARE @QUERY NVARCHAR(50) = 'SELECT ''' + @EMAIL + ''' as email';

DECLARE @SCRIPT NVARCHAR(MAX) = N'

OutputDataSet = InputDataSet
';


EXEC sp_execute_external_script  
  @language =N'Python',
  @script = @SCRIPT,
  @input_data_1 = @QUERY
  WITH RESULT SETS 
  (
    ( 
	  [EMAIL] NVARCHAR(50)
    )
  );



Выполняя EXEC [dbo].[p_proc] 'eee@tgf.com' получаю верный ответ в табличном виде
Как вывести в скалярном?

Смотрю в сторону скалярной функции:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE FUNCTION [dbo].[f_func] 
(
	@EMAIL NVARCHAR(50)
)
RETURNS NVARCHAR(50)
AS
BEGIN

DECLARE @QUERY NVARCHAR(50) = 'SELECT ''' + @EMAIL + ''' as email';
DECLARE @T TABLE ([EMAIL] NVARCHAR(50));
DECLARE @RESULT NVARCHAR(50);

DECLARE @SCRIPT NVARCHAR(MAX) = N'

OutputDataSet = InputDataSet
';

INSERT INTO @T
EXEC sp_execute_external_script  
  @language =N'Python',
  @script = @SCRIPT,
  @input_data_1 = @QUERY
  WITH RESULT SETS 
  (
    ( 
	  [EMAIL] NVARCHAR(50)
    )
  )

SELECT @RESULT = (SELECT [EMAIL] FROM @T);

RETURN(@RESULT);



Первая ошибка:
Код: plaintext
1.
Неправильный синтаксис около конструкции "SETS"

Когда комментирую WITH RESULT SETS:
Код: plaintext
1.
Недопустимое использование оператора "INSERT EXEC", оказывающего побочное действие, в функции.


Подскажите, пожалуйста
...
Рейтинг: 0 / 0
25.07.2021, 18:16
    #40086076
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
Глобально задача звучит так: "преобразовать строковое значение одного из полей в процедуре импорта"
Предположил что удобней реализовать через скалярную функцию. Но преобразование написано на Python.
Преобразование - изменение значение в зависимости от токена. Передали готовый код преобразования на питоне
...
Рейтинг: 0 / 0
26.07.2021, 07:34
    #40086110
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
jango77

Код: plaintext
1.
Недопустимое использование оператора "INSERT EXEC", оказывающего побочное действие, в функции.
Подскажите, пожалуйста


Чего тут непонятного?
Скалярные функции MS SQL имеют ограничения. Ограничения перечислены в документации.

Вам не светит вызвать внешний скрипт в скалярке.
...
Рейтинг: 0 / 0
26.07.2021, 08:48
    #40086121
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
aleks222, ну почему не светит? В CLR-ку завернуть.
Можно даже универсальный запускач сделать :-)
...
Рейтинг: 0 / 0
26.07.2021, 08:52
    #40086123
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
uaggster
aleks222, ну почему не светит? В CLR-ку завернуть.
Можно даже универсальный запускач сделать :-)


Можно и сервером гвозди заколачивать.
Но лучше - молотком.
...
Рейтинг: 0 / 0
26.07.2021, 10:47
    #40086152
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
Подскажите пожалуйста по поводу CLR, какой объект в нее завернуть, и что вызывать через нее?

Тогда может имеет смысл преобразование написать на C#, без питона?
...
Рейтинг: 0 / 0
26.07.2021, 11:20
    #40086161
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
jango77
Тогда может имеет смысл преобразование написать на C#, без питона?
Что за преобразование?
Может статься, что вообще проще и эффективнее будет делать средствами T-SQL.
...
Рейтинг: 0 / 0
26.07.2021, 11:45
    #40086171
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
invm, это код дешифровщика. Используется токен. Вероятно что есть способ сделать на SQL, но сам так не напишу, скинуть по понятным причинам не могу. CLR когда-то писал, если этот вариант будет рабочим, может так и сделаю.

Попрошу помощи в архитектуре, какую логику закинуть в CLR, что должно быть размещено в ней, и вызывать как скалярную функцию?
...
Рейтинг: 0 / 0
26.07.2021, 12:37
    #40086195
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
jango77,

авторВыполняя EXEC [dbo].[p_proc] 'eee@tgf.com' получаю верный ответ в табличном виде
Как вывести в скалярном?

Используйте output параметр в процедуре.
...
Рейтинг: 0 / 0
26.07.2021, 12:55
    #40086201
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
Владислав Колосов
jango77,

авторВыполняя EXEC [dbo].[p_proc] 'eee@tgf.com' получаю верный ответ в табличном виде
Как вывести в скалярном?


Используйте output параметр в процедуре.

Нужно добавить output параметр?
Код: sql
1.
2.
3.
4.
5.
CREATE PROCEDURE [dbo].[p_proc] 
(
	@EMAIL NVARCHAR(50),
	@EMAIL_DECODED NVARCHAR(50) OUTPUT 
)




Как сделать RETURN в @EMAIL_DECODED из EXEC sp_execute_external_script ?
...
Рейтинг: 0 / 0
26.07.2021, 13:05
    #40086208
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
jango77

Как сделать RETURN в @EMAIL_DECODED из EXEC sp_execute_external_script ?


1. Ну... так же как ты это пытался сделать в скалярке.

2. sp_execute_external_script ...
@params = N'@parameter_name data_type [ OUT | OUTPUT ] [ ,...n ]' ]
[ , @parameter1 = 'value1' [ OUT | OUTPUT ] [ ,...n ] ]
так попроще.


Код: sql
1.
set @EMAIL_DECODED = <ну шо там у тебя>;
...
Рейтинг: 0 / 0
26.07.2021, 14:55
    #40086239
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
В таком виде?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DECLARE @T TABLE ([EMAIL] NVARCHAR(50));

INSERT INTO @T
EXEC sp_execute_external_script  
  @language =N'Python',
  @script = @SCRIPT,
  @output_data_1 = N'OutputDataSet',
  @input_data_1 = @QUERY
  --WITH RESULT SETS 
  --(
  --  ( 
	 -- [EMAIL] NVARCHAR(50)
  --  )
  --)

SET @EMAIL_DECODED = (SELECT [EMAIL] FROM @T)
RETURN(@EMAIL_DECODED);



Вызываю

Код: sql
1.
2.
3.
4.
DECLARE @EMAIL_DECODED NVARCHAR(50)
EXEC [AnalyticData].[dbo].[p_proc] 'eee@tgf.com', @EMAIL_DECODED OUTPUT

SELECT @EMAIL_DECODED 



Ошибка

Код: plaintext
1.
Для процедуры требуется параметр "@params" типа "ntext/nchar/nvarchar".

Но более глобальный вопрос, как мне интегрировать процедуру, а не функцию, в процесс импорта

Код: sql
1.
2.
3.
4.
5.
INSERT INTO #temp
DELETE FROM table d INNER JOIN #temp t ON d.ID = t.ID

INSERT INTO table (EMAIL)
SELECT EMAIL FROM #temp




Предполагал так:

Код: sql
1.
2.
3.
4.
5.
INSERT INTO #temp
DELETE FROM table d INNER JOIN #temp t ON d.ID = t.ID

INSERT INTO table (EMAIL)
SELECT  f_decode(EMAIL) FROM #temp
...
Рейтинг: 0 / 0
26.07.2021, 15:15
    #40086245
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение Python-скрипта в скалярной функции
jango77,

Вы же не методом интуиции пользуйтесь, а методом чтения документации. Оно всегда срабатывает.


Кто же знает, какой у Вас процесс импорта? Если под "импортом" имеется в виду задача вставки в таблицу данные, которые возвращает процедура, то
Код: sql
1.
2.
3.
DECLARE @result нужный тип
EXEC процедура @emal = @переменная_с_чем-то_там, @output_value = @result output
insert нужная_таблица (поле) values (@result)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выполнение Python-скрипта в скалярной функции / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]