powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выполнение Python-скрипта в скалярной функции
13 сообщений из 13, страница 1 из 1
Выполнение Python-скрипта в скалярной функции
    #40086067
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день

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


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

Код: 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
Выполнение Python-скрипта в скалярной функции
    #40086076
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глобально задача звучит так: "преобразовать строковое значение одного из полей в процедуре импорта"
Предположил что удобней реализовать через скалярную функцию. Но преобразование написано на Python.
Преобразование - изменение значение в зависимости от токена. Передали готовый код преобразования на питоне
...
Рейтинг: 0 / 0
Выполнение Python-скрипта в скалярной функции
    #40086110
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jango77

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


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

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


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

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

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

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

Используйте output параметр в процедуре.
...
Рейтинг: 0 / 0
Выполнение Python-скрипта в скалярной функции
    #40086201
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
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
Выполнение Python-скрипта в скалярной функции
    #40086208
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Выполнение Python-скрипта в скалярной функции
    #40086239
jango77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таком виде?

Код: 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
Выполнение Python-скрипта в скалярной функции
    #40086245
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jango77,

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


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


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