powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параметризовать в функции название связанного сервера
30 сообщений из 30, показаны все 2 страниц
Параметризовать в функции название связанного сервера
    #40012410
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знатокам Transact-SQL (2008R2) задачка.

Прошу попробовать "намулевать" :-) здесь примерчик функции, возвращающей табличное значение (это одно из важных условий).

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

Спасибо!

Второй вопрос, не очень важный, но связанный с этой темой. Можно ли как-то сохранить функцию, в которой прямо указан связанный сервер, который на момент сохранения функции недоступен (или с таким названием не подключен, не существует). Конечно не закомментаривая при этом название сервера.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012414
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желаемое недостижимо - такую функцию написать невозможно.
Можно процедуру. Примерно такого вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create procedure ...
 @server_name sysname,
 @database_name sysname

as
begin
 ...
 declare @proc sysname = quotename(@server_name) + N'.' + quotename(@database_name) + N'.sys.sp_executesql';

 create table #t (...)
 insert into #t
  (...)
  exec @proc N'запрос';
 ...
end;
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012847
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, invm. Но нужна именно функция, возвращающая табличное значение.

Вообще говоря, на других сайтах (ранее, до того, как написал сюда) в меня бросались ссылками, что якобы какими-то хитрыми обходными путями это сделать все-таки можно. Но я к сожалению не смог понять и собрать воедино хоть какой-нибудь здравый пример.

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

Почему нельзя использовать инструкцию INSERT EXEC...
https://askdev.ru/q/pochemu-nelzya-ispolzovat-instrukciyu-insert-exec-v-hranimoy-procedure-vyzyvaemoy-drugoy-hranimoy-proceduroy-590392

EXECUTE sp_executesql...
https://social.technet.microsoft.com/Forums/ru-RU/aff3ab8d-49e0-4cd3-bfb9-e246da8ff527/execute-spexecutesql-sql?forum=transactsql

Подводные камни при использовании Linked Server...
https://inostudio.com/ru/article/LinkedServer.html

Еще на одном сайте писали про возвращаемый курсор, но я так понял это очень длительно по быстродействию.

Может быть кто-то сможет разжевать и понять, с чуть более развитыми челюстями и мозгом, нежели моим?
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012850
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
Но нужна именно функция, возвращающая табличное значение.
Еще раз - функцию, удовлетворяющую вашим требованиям, написать невозможно.
Даже CLR-функцию. Ибо функция не может возвращать набор с переменным числом столбцов.

Занавес.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012896
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, invm.

Вы меня неправильно поняли.

Я нигде не писал, что функция должна возвращать набор с переменным числом столбцов.
Мало того, даже совсем не важно, что вернет функция.

Нужно просто чтобы внутри кода любой некой "функции, возвращающей табличное значение" (это просто такой вид функций), которая неважно что возвращает, была бы определена некая временная табличка, с определенными там же, к коде столбцами. И чтобы в нее получились данные из связанного сервера и базы данных, названия которых там же подставлены (обязательно) через переменные.

Еще раз, более подробно.

Я писал что нужно параметризировать название связанного сервера (достаточно строковой переменной внутри кода функции).
А данные запроса из него (связанного сервера) чтобы получились во временную табличку, с определенными там же столбцами.
И все это чтобы просто работало внутри "функции, возвращающей табличное значение".
Всё.

Занавес снова открывается!

Вопрос снова актуален.

И очень-очень прошу рабочий проверенный код, а не "попробуйте вот как-то так".
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012901
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И первый и второй, дополнительный вопрос все так же актуальны.

Число столбцов и их тип у временной таблички не переменное количество и вид, а фиксированное. Определенное там же в коде.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012909
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem,

с какой целью это надо сделать? Какую решаете проблему?
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012921
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
Нет, invm.

Вы меня неправильно поняли.

Я нигде не писал, что функция должна возвращать набор с переменным числом столбцов.
Мало того, даже совсем не важно, что вернет функция.

Нужно просто чтобы внутри кода любой некой "функции, возвращающей табличное значение" (это просто такой вид функций), которая неважно что возвращает, была бы определена некая временная табличка, с определенными там же, к коде столбцами. И чтобы в нее получились данные из связанного сервера и базы данных, названия которых там же подставлены (обязательно) через переменные.

Еще раз, более подробно.

Я писал что нужно параметризировать название связанного сервера (достаточно строковой переменной внутри кода функции).
А данные запроса из него (связанного сервера) чтобы получились во временную табличку, с определенными там же столбцами.
И все это чтобы просто работало внутри "функции, возвращающей табличное значение".
Всё.

Занавес снова открывается!

Вопрос снова актуален.



На этом форуме прекрасно знают что такое TVF, пытаться объяснить нам что Вы имеете ввиду под этим не нужно.
Но у Вас выбран настолько специфичный подход к решению проблемы, что Вам пытаются намекнуть что вы идете в неправильную сторону.

И очень-очень прошу рабочий проверенный код, а не "попробуйте вот как-то так".


Из-за того что так никто не делает, требования к "рабочести" кода кажутся смехотворными.

ну хотите некое "абстрактное решение", пожалуйста. но не следует потом говорить "фиии" ибо у данного подхода есть куча ограничений, оно просто дает возможность создать tvf, но как оно будет работать при отсутствии нужных объектов никто гарантии не дает.

Код: 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 @sql nvarchar(max) = '
use master;
drop table if exists [t1];
create table [t1] (id int, val varchar(255));';
declare @srv sysname = QUOTENAME(@@SERVERNAME)

exec (@sql);
set @sql = formatmessage('create synonym [srv%iobj%i] for %s.[master].[dbo].[t1]', 1, 1, @srv);
exec (@sql);
set @sql = formatmessage('create synonym [srv%iobj%i] for %s.[master].[dbo].[t1]', 1, 2, @srv);
exec (@sql);
set @sql = formatmessage('create synonym [srv%iobj%i] for %s.[master].[dbo].[t1]', 2, 1, @srv);
exec (@sql);
set @sql = formatmessage('create synonym [srv%iobj%i] for %s.[master].[dbo].[t1]', 2, 2, @srv);
exec (@sql);
go

create or alter function [dbo].[TVF_GetIDS] (
      @srv sysname, 
      @db sysname
)
returns @tbl table ([id] int, [val] varchar(255)) 
as begin
    if @srv = 's1' and @db = 'd1' 
       insert into @tbl
         select [id], [val] from [srv1obj1];

    if @srv = 's1' and @db = 'd2' 
       insert into @tbl
         select [id], [val] from [srv1obj2];

    if @srv = 's2' and @db = 'd1' 
       insert into @tbl
         select [id], [val] from [srv2obj1];

    if @srv = 's2' and @db = 'd2' 
       insert into @tbl
         select [id], [val] from [srv2obj2];

return;
end;
go

drop synonym [srv1obj1];
drop synonym [srv1obj2];
drop synonym [srv2obj1];
drop synonym [srv2obj2];

/*
create synonym [srv1obj1] for нужный сервер.база.схема.объект [n...]
*/
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40012933
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафигачить динамический датасорс, а функцию бросить на него, не?

(по факту это альтернатива замене линкованного сервака; кстати, подмена ip-шника сервака-источника-данных спасёт отца русской демократии..., но это "так себе" решение)
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013303
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав, есть некие базисные универсальные хранимые процедуры, обрабатывающие некие базисные универсальные команды.
Трогать их нельзя, от слова совсем.
Можно трогать только несколько строго определенных функций, которые используются ими для получения вспомогательных данных из других источников.

Одна из таких немногих функций возвращает строго определенный набор данных. Из заранее неизвестных по названию и доступности прилинкованных источников данных, который выбирает в момент выполнения в зависимости от некоторых условий переданной ей строки - может брать эти данные с любого из прилинкованного сервера. Конечно названия прилинкованных серверов указаны прямо в коде функции, вручную, через точку. И созданы IF IF IF IF с копиями вариантов названий серверов, чтобы раскомментировать название связанных серверов уже по месту размещения рабочей версии... понятно это конечно фи, но рабочее фи.

Но разработка ведется в другой информационной среде, где этих источников не существует.
И функция при этом не сохраняется, потому что дотошно проверяет наличие и качество всех источников (чего в данном конкретном случае никто не просит, но так работает вся система, параметров "отключить это" не существует).
Создание dummy-прилинкованных "похожих" источников с табличками, а может и dummy-айпишниками и всем прочим... как пишет SIMPLicity конечно вариант, "но как-то, простите, некомильфо"...

Ну предложите иной вариант для получения данных из заранее неизвестных (а некоторых возможно и недоступных) на момент сохранения функции прилинкованных серверов (или может динамически прописанных списком в отдельной табличке). Еще раз напоминаю, все получаемые столбцы и таблички - известны и прописаны там же, в функции. Вот передать параметром в виде строки выбираемый прилинкованный сервер, с которого брать данные - это уже близко.

Вот, felix_ff близок. Чую... тепло, тепло... )

А еще я не понял, что имели в виду довольные люди, отметившие, что проблема якобы решена через insert прямо в коде sql запроса:
https://askdev.ru/q/pochemu-nelzya-ispolzovat-instrukciyu-insert-exec-v-hranimoy-procedure-vyzyvaemoy-drugoy-hranimoy-proceduroy-590392
Или они что-то иное имели в виду?
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013343
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
Владислав, есть некие базисные универсальные хранимые процедуры, обрабатывающие некие базисные универсальные команды.
Трогать их нельзя, от слова совсем.
Можно трогать только несколько строго определенных функций, которые используются ими для получения вспомогательных данных из других источников.
Разработчики выбрали функции, а не процедуры, как "точки кастомизации" системы, зная, что функции в сиквеле очень ограничены.

Значит, придётся писать IF IF IF IF, так решили разработчики этой системы. ИМХО решение с синонимами не сильно отличается, всё равно же IF IF IF IF.

CLR писать для такого случая совсем жесть.

Можно ещё генерить функцию динамически, как часть процесса добавления нового источника.

Mtgktem
А еще я не понял, что имели в виду довольные люди, отметившие, что проблема якобы решена через insert прямо в коде sql запроса:
https://askdev.ru/q/pochemu-nelzya-ispolzovat-instrukciyu-insert-exec-v-hranimoy-procedure-vyzyvaemoy-drugoy-hranimoy-proceduroy-590392
Ну, это автор решил такой конструкцией свою конкретную бизнес-задачу (например, какой нибудь расчёт оборотной ведомости). Дурацкая конструкция, но решил.

А вы решаете не бизнес-задачу, а свою личную задачу "всё таки как то сделать то, что запретил МС в сиквеле".
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013371
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem,

созданы IF IF IF IF с копиями вариантов названий серверов

это единственно верное решение в данной архитектурной ситуации. Своими действиями Вы ничего не "улучшите", а только ухудшите код и увеличите сложность системы, чего допускать нельзя.

По большому счету надо отказаться от связанных серверов. Я спрашивал "какая задача решается", а Вы снова описали решение, а не задачу, пусть даже это существующее решение.

Решение ради решения - это симптоматическое лечение.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013377
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
Но разработка ведется в другой информационной среде, где этих источников не существует.
И функция при этом не сохраняется, потому что дотошно проверяет наличие и качество всех источников (чего в данном конкретном случае никто не просит, но так работает вся система, параметров "отключить это" не существует).
Создание dummy-прилинкованных "похожих" источников с табличками, а может и dummy-айпишниками и всем прочим... как пишет SIMPLicity конечно вариант, "но как-то, простите, некомильфо"...
Это решается синонимами.
Для каждого сочетания (сервер, БД) создается синоним таблицы-источника.
В рабочей среде эти синонимы указывают на реальные источники. В девелоперской - на фейковые, можно даже на один локальный для всех синонимов.

А чтобы избавиться от синонимов и IF IF IF IF..., реализуйте эту функцию через CLR.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013381
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В среде разработки создаются профили публикации, в локальных профилях переменные принимают значения фейковых баз. Фейковые же базы включаются в решение и разворачивают локально один раз. Это базы включают нужные таблицы, процедуры, представления, к которым обращается связанный сервер.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013623
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав, я описал то, что наиболее приближено к реальности, таким способом, как смог. Иначе бы мне Ваш вопрос напомнил бы анекдот:
- А где ты работаешь?
- Это секрет.
- А что ты на своей работе производишь?
- Это секрет.
- А сколько тебе платят?
- Ой, да по четвертаку за гранату.

А если подумать...
Неужели все так плохо, что нельзя простым путем получить данные, выбрав их по условию из заранее неизвестного источника?

С "закомментариванием" и синонимами названий серверов это конечно костыль, но хотя бы рабочий.
Спасибо.

С той ссылкой и инсертом я все равно ничего не понял, как это работает. Может это какое-то решение, которое бы мне подошло?
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013625
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамический сбор данных со многих источников мне кажется не лучшей задачей для MSSQL. Хотя, наверное, я ещё НЕ встречал задачу, которую бы не смог решить в рамках MSSQL (с добавками) (по крайней мере в виде прототипа).
Если Вам описанная хрень нужна ТОЛЬКО в процессе разработки,- не поленитесь,- сделайте полное окружение, идентичное "боевому". А так Вы в систему с уё@@щным дизайном (простите мне мой португальский) добавите ещё и долбо*6ическую универсальность. Оно конечно взлетит. И даже будет жить, возможно, на "золотом" железе в окружении послушных исполнителей. Но вот надо ли?

PS Естественно, что я могу ошибаться как в оценках так и в рецептах,- так как не знаю конечных контрольных точек топикстартера. Но я полностью поддерживаю более мудрых коллег в том, что Ваш путь излишне тернист...

Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013627
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MtgktemНеужели все так плохо, что нельзя простым путем получить данные, выбрав их по условию из заранее неизвестного источника?Ну, напишите свою систему, которая будет "простым путем получать данные, выбирая их по условию из заранее неизвестного источника". Поскольку компания Microsoft в их SQL Server совершила грубую стратегическую ошибку и не предоставила такого инструмента, а так же судя по вам и остальным вопрошающим, спрос будет. Обогатитесь просто.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013628
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SIMPLicity_, предложите другой путь. Ровный пологий и простой. С получением данных из нескольких источников, внутри функции. (вложение видел)

Кстати, вариант с динамическим созданием функции по событию "подключение нового источника" очень любопытен и неплох. Потому что в этой базе все происходит только через скрипты, начиная от создания самой базы. Добавить скрипт на подключение нового источника - это можно. Пожалуй, это стоит обдумать! Спасибо, alexeyvg

"Хорошая мысля приходит опосля!"
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013629
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
SIMPLicity_, предложите другой путь. Ровный пологий и простой. С получением данных из нескольких источников, внутри функции.

Кстати, вариант с динамическим созданием функции по событию "подключение нового источника" очень любопытен и неплох. Потому что в этой базе все происходит только через скрипты, начиная от создания самой базы. Добавить скрипт на подключение нового источника - это можно. Пожалуй, это стоит обдумать! Спасибо, alexeyvg

"Хорошая мысля приходит опосля!"
Нет ничего тупее ситуации, когда какой-то валяющейся внешний сервер влияет на деплой кода или работоспособность системы. Это примерно если бы вы собрались по магазинам, а вам полицейский при выходе из подъезда бьет дубинкой по темечку со словами "пятерка сегодня закрыта, сиди дома", а вы в Ашан собирались...
Ну и рано или поздно код вы сможете деплоить примерно никогда, потому что что-то обязательно будет в любой момент не работать.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013631
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"сделайте полное окружение, идентичное "боевому"."

SIMPLicity_, Вы что издеваетесь, ради того, чтобы сохранить несколько функций наустанавливать кучу МССкулей, Ораклов, Фаербердов, и... шайтан его знает каких еще серверов-источников данных?? Ну с синонимами еще как-то ладно... да и то, "полной идентичности" не выйдет - всех полей исходных таблиц я все равно никогда не узнаю - мне их никто и не даст! Мне известны только выбираемые поля и название таблички.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013632
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,
да, сударь, изволили сказать всё верно, всё так... вот именно посему и возник сей вопрос...
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013633
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
"сделайте полное окружение, идентичное "боевому"."

SIMPLicity_, Вы что издеваетесь, ради того, чтобы сохранить несколько функций наустанавливать кучу МССкулей, Ораклов, Фаербердов, и... шайтан его знает каких еще серверов-источников данных??
Человека, который ясно видит цель, такие мелочи не остановят.
Слабые же духом наверняка задумаются, зачем им беременеть себе мозг с такими функциями, особенно если в обмене данными между системами все уже давно украдено без таких геморроев.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013634
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич, сударь, таки не учите как жить, а лучше помогите материально. В смысле, кодом. Не ради красоты же мс реализовали связанные сервера, а чтобы этим пользоваться.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013637
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mtgktem
сударь, таки не учите как жить, а лучше помогите материально. В смысле, кодом.
Помогаю кодом: sp_dropserver . Не благодарите.
Mtgktem
Не ради красоты же мс реализовали связанные сервера, а чтобы этим пользоваться.
Ржу в голос, простите. То, как они это реализовали, даже к красоте не имеют отношения: скорее маркетологическая галочка в фичах. В целом, абсолютно унылая неработоспособная хрень в большинстве сценариев.
И это мы еще не начали обсуждать интеграции с другими СУБД, где есть неродные полукривые драйвера для доступа, которые норовят скуль приложить отдохнуть.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013640
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Ржу в голос, простите. То, как они это реализовали, даже к красоте не имеют отношения: скорее маркетологическая галочка в фичах. В целом, абсолютно унылая неработоспособная хрень в большинстве сценариев.

не соглашусь с Вами, в целом LS достаточно жизнеспособна, особенно когда мапятся mssql <=> mssql.
про коммуникацию к другим СУБД, согласен приходится танцевать с бубнами.

Mtgktem,

еще раз вопрос: че вы привязались именно к TVF? хотите более менее нормально выстроить ломанную логику используйте хранимые процедуры, нахрена вам именно табличные функции?
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40013650
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
create or alter function [dbo].[fnLS_ID] (
      @srv sysname, 
      @db sysname
)
returns @tbl table ([id] int) 
as begin
	declare @sConnectionString varchar(150) = 'Provider=SQLOLEDB;Server=(local);Database=test;Integrated Security=SSPI;'
	declare
			@cn int,
			@hResult int,
			@sErrorSource varchar(255),
			@sErrorDesc varchar(255),
			@sSQL varchar(8000),
			@rs int,
			@xmlDoc int,
			@xml_data varchar(8000),
			@xml xml

	--	**********************************
	set @sSQL = 'select f from ' + quotename(@srv) + '.' + quotename(@db) + '.[dbo].[test]';

	exec @hResult = sp_OACreate 'ADODB.Connection', @cn out;
	exec @hResult = sp_OACreate 'MSXML2.DOMDocument', @xmlDoc out;

	exec @hResult = sp_OAMethod @cn, 'Open', null, @sConnectionString;

	exec @hResult = sp_OAMethod @cn, 'Execute', @rs out, @sSQL;
	exec @hResult = sp_OAMethod @rs, 'Save', null, @xmlDoc, 1;

	exec @hResult = sp_OAMethod @xmlDoc, 'xml', @xml_data out;

	set @xml = cast(@xml_data as xml)

	insert into @tbl (id)
	select
		x.c.value('@f', 'int')
	from @xml.nodes('xml/*:data/*:row') as x(c)

	--
	exec @hResult = sp_OAMethod @cn, 'Close';
	exec @hResult = sp_OADestroy @xmlDoc;
	exec @hResult = sp_OADestroy @rs;
	exec @hResult = sp_OADestroy @cn;

	--
	return;
end;


"да", - тут "всё плохо" :)
начиная с @xml_data varchar( 8000 ) (можно "решить" циклом по рекордсету, отказавшись от xml)
и заканчивая правами коннекта на ЛС
просто считайте это "иллюстрацией" принципиальной возможности "хотелки"
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40014054
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Mtgktem
"сделайте полное окружение, идентичное "боевому"."

SIMPLicity_, Вы что издеваетесь, ради того, чтобы сохранить несколько функций наустанавливать кучу МССкулей, Ораклов, Фаербердов, и... шайтан его знает каких еще серверов-источников данных??
Человека, который ясно видит цель, такие мелочи не остановят.
Слабые же духом наверняка задумаются, зачем им беременеть себе мозг с такими функциями, особенно если в обмене данными между системами все уже давно украдено без таких геморроев.


Окей!
Возвращаемся в 1994 год. Вспоминаем "как бы объектное" программирование.
Пишем свой обработчик входящего JSON-a: {Таблица:..., Формат:...., Действие:...., Данные:"<тута, ка ни стронно, ещё один JSON обо Ваши данные НЕформализованы по условию задачи>"}
Обработчик вешаем слушать порт (либо напрямую либо прикручиваем к nginx-у) и пишем для него .ini-шку для подключения к нужному нам в данным момент скуль-серверу. Все "потоки данных" как хочут ломятся на сервис (гадят в означенный порт,- удачно или не очень) и отправляют свои данные в Ваше хоронилище. При необходимости проектируете распределённую систему.

Такой вариант, кстати, работает.


В общем-то web-технологии в общем целом Вашу задачу решили, и уже давно.

PS использование xml вместо JSON эту конструкцию формализует
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40014056
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Гавриленко Сергей Алексеевич
Ржу в голос, простите. То, как они это реализовали, даже к красоте не имеют отношения: скорее маркетологическая галочка в фичах. В целом, абсолютно унылая неработоспособная хрень в большинстве сценариев.

не соглашусь с Вами, в целом LS достаточно жизнеспособна, особенно когда мапятся mssql <=> mssql.
про коммуникацию к другим СУБД, согласен приходится танцевать с бубнами.

Mtgktem,

еще раз вопрос: че вы привязались именно к TVF? хотите более менее нормально выстроить ломанную логику используйте хранимые процедуры, нахрена вам именно табличные функции?


Поддерживаю. Линкованные сервера MSSQL-MSSQL рулят. Не всё хорошо и гладко, но решает много-много проблем.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40014077
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SIMPLicity_ , это верно, старые дедовские методы работают, проверено, надежно и понятно. И много чего "оттуда" используется и сейчас. Почти как некоторые устройства советских времен, исправные до сих пор - с толстыми проводами, качественным металлом, надежной конструкции, с понятной схемой и инструкцией починки.

Но в данном случае задача другая.
Никакой из источников данных сам не будет в меня бросаться ни xml-линами ни json-нами, если его не окучить особым образом. А окучивать каждый источник никто не будет. С точки зрения технологий, кроме разрешения прав доступа, источники данных и не должны ничего обрабатывать или отдавать xml и вообще ничего знать об этом. В принципе, связанные сервера задачу забора данных (а не передачи! и не взаимодействия!) успешно решают, просто использование и разработка были бы в разы удобнее, если несколько формализовать это дело. Например, создав табличку с динамическим добавлением и удалением из нее источника данных.
...
Рейтинг: 0 / 0
Параметризовать в функции название связанного сервера
    #40014082
Mtgktem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторче вы привязались именно к TVF?
я уже писал об этом
потому что уже существуют "некие глобальные хранимые" - недотроги , от которых все и крутится, вызывающие себе функции с возвратом таблиц данных с разных источников, вот они вполне очень трогательные .

Так вот. Не надо ржать.
Задачу решили сделать так, может и неожиданно, но вариант. И он тоже является в какой-то мере надежным и простым дедовским способом:

ЦЛР решено не делать.

Раз уж всё равно всё, что этим прожехом связано - работает исключительно на скриптах и перед запуском скриптов всё равно все скрипты проходят некий свой собственный препроцессор, его решили настроить так, что при отработке (в целом редкого) события "добавить новый источник данных" препроцессор каждый раз будет создавать уникальную функцию для получения данных из него. А в общую функцию получения данных из источников в нужное место вставляться код с вызовом этой уникальной функции.
Минусы есть, но не критичные.

Всё.

Если вдруг кто-то предложит какой-то иной дельный вариант, конечно почитаю для пользы дела.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Параметризовать в функции название связанного сервера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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