powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_execute_external_script: Как передать параметр в скрипт?
13 сообщений из 13, страница 1 из 1
sp_execute_external_script: Как передать параметр в скрипт?
    #40015199
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Целые передаются

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare   @param1 INT=100
declare   @param2 INT=50
declare   @param3 INT=3

EXECUTE sp_execute_external_script @language = N'Python'
    , @script = N'
import numpy
import pandas
OutputDataSet = pandas.DataFrame(numpy.random.normal(size=mynumbers, loc=mymean, scale=mysd));
'
    , @input_data_1 = N'   ;'
    , @params = N' @mynumbers int, @mymean int, @mysd int'
    , @mynumbers = @param1
    , @mymean = @param2
    , @mysd = @param3
WITH RESULT SETS(([Density] FLOAT NOT NULL));
GO




А как передать nvarchar(max) ?

Делаю так: пытаюсь передать параметром строку с путем, где сохранять график.
Если захардкодировать - все сохраняет, если же переметризую - пишет ошибку

авторMsg 8144, Level 16, State 2, Line 2
Procedure or function has too many arguments specified.



Что не так?

Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
DECLARE @pscript NVARCHAR(MAX);
DECLARE @path NVARCHAR(MAX)=N'e:\\charts\\Anomalies2.pdf';
SET @pscript = N'
# import Python modules
import matplotlib
matplotlib.use("PDF")
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from microsoftml import rx_oneclass_svm, rx_predict
# create data frame
iris = load_iris()
df = pd.DataFrame(iris.data)
df.reset_index(inplace=True)
df.columns = ["Plant", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]
# split data frame into training and test data
train, test = train_test_split(df, test_size=.06)
# generate model
svm = rx_oneclass_svm(
  formula="~ SepalLength + SepalWidth + PetalLength + PetalWidth", data=train)
# add anomalies to test data
test2 = pd.DataFrame(data=dict(
Plant = [175, 200],
SepalLength = [2.9, 3.1], 
SepalWidth = [.85, 1.1],
PetalLength = [2.6, 2.5], 
PetalWidth = [2.7, 3.2]))
test = test.append(test2)
# score test data
scores = rx_predict(svm, data=test, extra_vars_to_write="Plant")
# create scatter plot
pt = scores.plot.scatter(x="Plant", y="Score", c="navy", s=35, alpha=.8)
# configure scatter plot title and grid
pt.set_title(label=" Identifying Iris Anomalies", y=1.04, 
  fontsize=14, weight=500, color="navy")
pt.grid(color="slategray", alpha=.5, linestyle="dotted", linewidth=.5)
# configure scatter plot Y-axis and X-axis labels
pt.set_ylabel("Species Scoring", labelpad=20, fontsize=12, color="navy")
pt.set_xlabel("Iris Species (by ID)", labelpad=20, fontsize=12, color="navy")
# save scatter plot to .pdf file
plt.savefig(chartpath,
  bbox_inches="tight", pad_inches=.8)';
--plt.savefig("e:\\charts\\Anomalies.pdf",

EXEC sp_execute_external_script
  @language = N'Python',
  @params = N' @chartpath NVARCHAR(MAX)',
  @chartpath = @path,
  @script = @pscript;     
GO
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015257
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

у меня сейчас под рукой машины с ML нет не могу посмотреть точно: но если мне память не изменяет то sp_execute_external_script это расширенная процедура, в таких порядок следования и типы параметров важны, попробуйте так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
EXEC sp_execute_external_script
  @language = N'Python',
  @script = @pscript,
  @params = N' @chartpath NVARCHAR(MAX)',
  @chartpath = @path;

GO
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015396
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, как выше советуют - порядок следования параметров в этой SP_ важен,

вот это прекрасно исполняется:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE @path NVARCHAR(MAX)
set @path=N'c:\\tst\\out_file_'+replace(convert(varchar(16),getdate(),114),':','_')+'.pdf';
DECLARE @pscript NVARCHAR(MAX)
set @pscript=N'
import matplotlib
matplotlib.use("PDF")
import matplotlib.pyplot as plt
plt.plot(list(range(0,5,1)))
plt.savefig(
  chartpath,
  # "c:\\tst\\out_file2.pdf"
  bbox_inches="tight",
  pad_inches=.8)'
EXEC sp_execute_external_script
  @language = N'Python',
  @script = @pscript ,
  @params = N' @chartpath NVARCHAR(MAX)',
  @chartpath = @path


но стоит скрипт поставить последним параметром - сразу сыпется

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE @path NVARCHAR(MAX)
set @path=N'c:\\tst\\out_file_'+replace(convert(varchar(16),getdate(),114),':','_')+'.pdf'
DECLARE @pscript NVARCHAR(MAX)
set @pscript=N'
import matplotlib
matplotlib.use("PDF")
import matplotlib.pyplot as plt
plt.plot(list(range(0,5,1)))
plt.savefig(
  # chartpath,
   "'+@path+'", # <<< injected parameter from sql side
  bbox_inches="tight",
  pad_inches=.8)'
EXEC sp_execute_external_script
  @language = N'Python',
  @script = @pscript
  --,@params = N' @chartpath NVARCHAR(MAX)',
  --@chartpath = @path



параметры и числовые и стринговые без проблем работают и на вход и на выход:

Код: 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.
33.
34.
-- Input params
declare @txt_in0 nvarchar(max)
set @txt_in0=N'c:\\tst\\out_file_'+replace(convert(varchar(16),getdate(),114),':','_')+'.pdf'
declare @int_in1 int=1000
-- Output params
declare @txt_ou0 nvarchar(max)
declare @int_ou1 int
-- SQL query
declare @qry nvarchar(max)=N'select top 5 name as x,column_id as y from sys.all_columns'
-- Python script
declare @py_scr nvarchar(max)=N'import pandas as pd
my_sql_input_set["x_0"]=my_sql_input_set["x"]+" _ "+in0
my_sql_input_set["y_0"]=in1+my_sql_input_set["y"]
import sys
ou0=sys.platform+" _ "+sys.version
import random
ou1=random.randint(0,9999)
my_py_result=pd.DataFrame(my_sql_input_set)'

exec sp_execute_external_script
@language=N'Python',
@script=@py_scr,
@input_data_1=@qry,
@input_data_1_name=N'my_sql_input_set',
@output_data_1_name=N'my_py_result',
@params=N'@ou0 nvarchar(max) OUTPUT, @ou1 int OUTPUT, @in0 nvarchar(max), @in1 int',
@ou0=@txt_ou0 OUT,
@ou1=@int_ou1 OUT,
@in0=@txt_in0,
@in1=@int_in1
-- modified dataset
WITH RESULT SETS(("x" nvarchar(max),"y" int,"x_0" nvarchar(max),"y_0" int))
-- out parameters
select @txt_ou0 as a,@int_ou1 as b
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015485
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо , так и есть порядок важен, но возникает смутное сомнение:
1. При вызове ведь указываются имена параметров, какая разница какой порядок следования?
2. MS объявил расширенные процедуры пережитком прошлого, возможно это SQLCLR , но опять же - параметры по именам указываются, проблем вроде бы быть не должно
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015513
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

нет расширенные процедуры это не CLR.

у данной процедуры два фиксированных параметра @lang и @script они всегда должны идти в порядке определенном в дефе-хранимки. а вот уже @params и остальные динамические параметры вы можете передавать в процедуру в любом порядке.
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015516
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

расширенная процедура - это dll библиотека или exe файл, программы этого типа не имеют именованных параметров, они считывают параметры в очередности слева направо по строке выполнения.

Для отсылки почты, например, используется внешнее приложение, которое выполняет сервер.
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015540
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Ролг Хупин,

нет расширенные процедуры это не CLR.

у данной процедуры два фиксированных параметра @lang и @script они всегда должны идти в порядке определенном в дефе-хранимки. а вот уже @params и остальные динамические параметры вы можете передавать в процедуру в любом порядке.


я так и написал, возможно это не расширенная, а SQLCLR.

Покрутив Python я, поняв как он работает, честно говоря, так до конца и не понял, зачем он нужен в сервере? В чем его + ?
Зачем майкрософт его прикрутил?
Почему не сделать c# в качестве скрипта?
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015542
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Код: sql
1.
select type_desc from sys.all_objects where name = 'sp_execute_external_script'
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015605
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

питон добавили ради библиотек машинного обучения.
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015730
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Ролг Хупин,

питон добавили ради библиотек машинного обучения.


Ну, так, MS могла бы свой ML.NET продвигать.
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015746
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Когда они начали - его (ML.NET) ещё не было, по моему в том числе и для этого они приобретали Revolution Analytics (только R сначала прикрутили к SQL ML Services {или как они тогда назывались} в SQL Server 2016, питон потом в 2017м добавили), т.к. R в первую очередь разрабатывалась для аналитики, а Python в основном под ETL автоматизацию, это потом они уже навстречу друг к другу начали двигаться по функционалу (причём рынок в результате лучше принял Python, R в разы менее популярен и судя по скорости роста - скорее всего вообще сдаст позиции, я сам по ошибке сначала за R засел, потерял пару лет пока понял что не на то поставил, срочно пришлось переходить на Py), ну и соответственно с развитием облачных продуктов, DL/BigData и пр. {их Synapse/DWH/PDW довольно хороший доступ к данным даёт, и по объёмам и по скорости} - под задачи DS уже потом начал расти MS/Azure рынок ML (DataBricks на Azure довольно удачно стал двигаться) со всякими их собственными поделками типа ML.NET, AutoML и т.д. (часть и которых уже практически в прошлом, по моему не сильно растёт их кокос/ловится крокодил в Azure ML Services и др. их собственных продуктax, тот-же ML Studio чисто если только побаловаться, HDInsight вроде тоже не сильно взлетел, что-то ещё там с Time Series Insights шаманят, Stream Analytics - но их не сильно видно в решениях прямо так чтобы повсюду)..
В принципе всё это видно если поискать вакансии (требования и финансовое вознаграждение), на тот-же Python предложений на порядок больше чем для R, а для AutoML/ML.NET - практически ничего (если не считать базового C# на таких проектах например - а там чем ты из доступного решаешь задачи уже твоё дело)..
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015755
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имо в этом направлении MS катастрофически отстали. Если вообще надо было развивать это направление. Они ж на офисах бабло думали рубить, но катийцы их, похоже, и здесь опередили. Остаются ПК и серверные системы.
...
Рейтинг: 0 / 0
sp_execute_external_script: Как передать параметр в скрипт?
    #40015756
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заодно: про то что C# компилируемый
(тестовые онлайн сервисы вроде try.net явно не для прода, но есть скриптовые компиляторы типа Mono),
а Python/R интерпретируемые ЯП - даже вопросов не должно быть
(хотя та-же clr sql процедура sp_rxpredict или sql функция Predict() использует Py/R модель уже
в компилированном виде {сжатом под свой формат, но естественно не в конечном машинном коде},
но всё равно через свой интерпретатор)

Java который добавили к Python/R в ML на SQL Server 2019 - как-бы больше компилируемый,
(но там больше доступ к классам/jar сжатым файлам)
так что вполне может быть когда-нибудь и C# появится в какой-то скриптовой форме
для вариантов попроще где скорость не важна.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_execute_external_script: Как передать параметр в скрипт?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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