Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
27.10.2020, 23:37
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Знатокам Transact-SQL (2008R2) задачка. Прошу попробовать "намулевать" :-) здесь примерчик функции, возвращающей табличное значение (это одно из важных условий). Внутри которой во временную табличку (с определенными там же заданными столбцами) получаются данные из связанного сервера. Обязательно с возможностью там же параметризовать через переменные название связанного сервера и название базки. Отдельно прошу "не бросаться в меня ссылками", а лучше проверенным рабочим кодом )) Спасибо! Второй вопрос, не очень важный, но связанный с этой темой. Можно ли как-то сохранить функцию, в которой прямо указан связанный сервер, который на момент сохранения функции недоступен (или с таким названием не подключен, не существует). Конечно не закомментаривая при этом название сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.10.2020, 23:57
|
|||
---|---|---|---|
Параметризовать в функции название связанного сервера |
|||
#18+
Желаемое недостижимо - такую функцию написать невозможно. Можно процедуру. Примерно такого вида Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.10.2020, 20:22
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Спасибо, 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 Еще на одном сайте писали про возвращаемый курсор, но я так понял это очень длительно по быстродействию. Может быть кто-то сможет разжевать и понять, с чуть более развитыми челюстями и мозгом, нежели моим? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.10.2020, 20:41
|
|||
---|---|---|---|
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem Но нужна именно функция, возвращающая табличное значение. Даже CLR-функцию. Ибо функция не может возвращать набор с переменным числом столбцов. Занавес. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.10.2020, 23:24
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Нет, invm. Вы меня неправильно поняли. Я нигде не писал, что функция должна возвращать набор с переменным числом столбцов. Мало того, даже совсем не важно, что вернет функция. Нужно просто чтобы внутри кода любой некой "функции, возвращающей табличное значение" (это просто такой вид функций), которая неважно что возвращает, была бы определена некая временная табличка, с определенными там же, к коде столбцами. И чтобы в нее получились данные из связанного сервера и базы данных, названия которых там же подставлены (обязательно) через переменные. Еще раз, более подробно. Я писал что нужно параметризировать название связанного сервера (достаточно строковой переменной внутри кода функции). А данные запроса из него (связанного сервера) чтобы получились во временную табличку, с определенными там же столбцами. И все это чтобы просто работало внутри "функции, возвращающей табличное значение". Всё. Занавес снова открывается! Вопрос снова актуален. И очень-очень прошу рабочий проверенный код, а не "попробуйте вот как-то так". ... |
|||
:
Нравится:
Не нравится:
|
|||
|
28.10.2020, 23:36
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
И первый и второй, дополнительный вопрос все так же актуальны. Число столбцов и их тип у временной таблички не переменное количество и вид, а фиксированное. Определенное там же в коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.10.2020, 00:17
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem, с какой целью это надо сделать? Какую решаете проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.10.2020, 01:45
|
|||
---|---|---|---|
Параметризовать в функции название связанного сервера |
|||
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
29.10.2020, 05:32
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Нафигачить динамический датасорс, а функцию бросить на него, не? (по факту это альтернатива замене линкованного сервака; кстати, подмена ip-шника сервака-источника-данных спасёт отца русской демократии..., но это "так себе" решение) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 01:27
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Владислав, есть некие базисные универсальные хранимые процедуры, обрабатывающие некие базисные универсальные команды. Трогать их нельзя, от слова совсем. Можно трогать только несколько строго определенных функций, которые используются ими для получения вспомогательных данных из других источников. Одна из таких немногих функций возвращает строго определенный набор данных. Из заранее неизвестных по названию и доступности прилинкованных источников данных, который выбирает в момент выполнения в зависимости от некоторых условий переданной ей строки - может брать эти данные с любого из прилинкованного сервера. Конечно названия прилинкованных серверов указаны прямо в коде функции, вручную, через точку. И созданы 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 Или они что-то иное имели в виду? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 09:16
|
|||
---|---|---|---|
Параметризовать в функции название связанного сервера |
|||
#18+
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 А вы решаете не бизнес-задачу, а свою личную задачу "всё таки как то сделать то, что запретил МС в сиквеле". ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 10:56
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem, созданы IF IF IF IF с копиями вариантов названий серверов это единственно верное решение в данной архитектурной ситуации. Своими действиями Вы ничего не "улучшите", а только ухудшите код и увеличите сложность системы, чего допускать нельзя. По большому счету надо отказаться от связанных серверов. Я спрашивал "какая задача решается", а Вы снова описали решение, а не задачу, пусть даже это существующее решение. Решение ради решения - это симптоматическое лечение. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 11:22
|
|||
---|---|---|---|
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem Но разработка ведется в другой информационной среде, где этих источников не существует. И функция при этом не сохраняется, потому что дотошно проверяет наличие и качество всех источников (чего в данном конкретном случае никто не просит, но так работает вся система, параметров "отключить это" не существует). Создание dummy-прилинкованных "похожих" источников с табличками, а может и dummy-айпишниками и всем прочим... как пишет SIMPLicity конечно вариант, "но как-то, простите, некомильфо"... Для каждого сочетания (сервер, БД) создается синоним таблицы-источника. В рабочей среде эти синонимы указывают на реальные источники. В девелоперской - на фейковые, можно даже на один локальный для всех синонимов. А чтобы избавиться от синонимов и IF IF IF IF..., реализуйте эту функцию через CLR. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.10.2020, 11:28
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
В среде разработки создаются профили публикации, в локальных профилях переменные принимают значения фейковых баз. Фейковые же базы включаются в решение и разворачивают локально один раз. Это базы включают нужные таблицы, процедуры, представления, к которым обращается связанный сервер. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 01:19
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Владислав, я описал то, что наиболее приближено к реальности, таким способом, как смог. Иначе бы мне Ваш вопрос напомнил бы анекдот: - А где ты работаешь? - Это секрет. - А что ты на своей работе производишь? - Это секрет. - А сколько тебе платят? - Ой, да по четвертаку за гранату. А если подумать... Неужели все так плохо, что нельзя простым путем получить данные, выбрав их по условию из заранее неизвестного источника? С "закомментариванием" и синонимами названий серверов это конечно костыль, но хотя бы рабочий. Спасибо. С той ссылкой и инсертом я все равно ничего не понял, как это работает. Может это какое-то решение, которое бы мне подошло? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 01:20
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Динамический сбор данных со многих источников мне кажется не лучшей задачей для MSSQL. Хотя, наверное, я ещё НЕ встречал задачу, которую бы не смог решить в рамках MSSQL (с добавками) (по крайней мере в виде прототипа). Если Вам описанная хрень нужна ТОЛЬКО в процессе разработки,- не поленитесь,- сделайте полное окружение, идентичное "боевому". А так Вы в систему с уё@@щным дизайном (простите мне мой португальский) добавите ещё и долбо*6ическую универсальность. Оно конечно взлетит. И даже будет жить, возможно, на "золотом" железе в окружении послушных исполнителей. Но вот надо ли? PS Естественно, что я могу ошибаться как в оценках так и в рецептах,- так как не знаю конечных контрольных точек топикстартера. Но я полностью поддерживаю более мудрых коллег в том, что Ваш путь излишне тернист... Модератор: Вложение удалено. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 01:32
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
MtgktemНеужели все так плохо, что нельзя простым путем получить данные, выбрав их по условию из заранее неизвестного источника?Ну, напишите свою систему, которая будет "простым путем получать данные, выбирая их по условию из заранее неизвестного источника". Поскольку компания Microsoft в их SQL Server совершила грубую стратегическую ошибку и не предоставила такого инструмента, а так же судя по вам и остальным вопрошающим, спрос будет. Обогатитесь просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 01:36
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
SIMPLicity_, предложите другой путь. Ровный пологий и простой. С получением данных из нескольких источников, внутри функции. (вложение видел) Кстати, вариант с динамическим созданием функции по событию "подключение нового источника" очень любопытен и неплох. Потому что в этой базе все происходит только через скрипты, начиная от создания самой базы. Добавить скрипт на подключение нового источника - это можно. Пожалуй, это стоит обдумать! Спасибо, alexeyvg "Хорошая мысля приходит опосля!" ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 01:45
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem SIMPLicity_, предложите другой путь. Ровный пологий и простой. С получением данных из нескольких источников, внутри функции. Кстати, вариант с динамическим созданием функции по событию "подключение нового источника" очень любопытен и неплох. Потому что в этой базе все происходит только через скрипты, начиная от создания самой базы. Добавить скрипт на подключение нового источника - это можно. Пожалуй, это стоит обдумать! Спасибо, alexeyvg "Хорошая мысля приходит опосля!" Ну и рано или поздно код вы сможете деплоить примерно никогда, потому что что-то обязательно будет в любой момент не работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 02:01
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
"сделайте полное окружение, идентичное "боевому"." SIMPLicity_, Вы что издеваетесь, ради того, чтобы сохранить несколько функций наустанавливать кучу МССкулей, Ораклов, Фаербердов, и... шайтан его знает каких еще серверов-источников данных?? Ну с синонимами еще как-то ладно... да и то, "полной идентичности" не выйдет - всех полей исходных таблиц я все равно никогда не узнаю - мне их никто и не даст! Мне известны только выбираемые поля и название таблички. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 02:04
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Гавриленко Сергей Алексеевич, да, сударь, изволили сказать всё верно, всё так... вот именно посему и возник сей вопрос... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 02:06
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem "сделайте полное окружение, идентичное "боевому"." SIMPLicity_, Вы что издеваетесь, ради того, чтобы сохранить несколько функций наустанавливать кучу МССкулей, Ораклов, Фаербердов, и... шайтан его знает каких еще серверов-источников данных?? Слабые же духом наверняка задумаются, зачем им беременеть себе мозг с такими функциями, особенно если в обмене данными между системами все уже давно украдено без таких геморроев. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 02:16
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Гавриленко Сергей Алексеевич, сударь, таки не учите как жить, а лучше помогите материально. В смысле, кодом. Не ради красоты же мс реализовали связанные сервера, а чтобы этим пользоваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 02:42
|
|||
---|---|---|---|
|
|||
Параметризовать в функции название связанного сервера |
|||
#18+
Mtgktem сударь, таки не учите как жить, а лучше помогите материально. В смысле, кодом. Mtgktem Не ради красоты же мс реализовали связанные сервера, а чтобы этим пользоваться. И это мы еще не начали обсуждать интеграции с другими СУБД, где есть неродные полукривые драйвера для доступа, которые норовят скуль приложить отдохнуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
31.10.2020, 04:04
|
|||
---|---|---|---|
Параметризовать в функции название связанного сервера |
|||
#18+
Гавриленко Сергей Алексеевич Ржу в голос, простите. То, как они это реализовали, даже к красоте не имеют отношения: скорее маркетологическая галочка в фичах. В целом, абсолютно унылая неработоспособная хрень в большинстве сценариев. не соглашусь с Вами, в целом LS достаточно жизнеспособна, особенно когда мапятся mssql <=> mssql. про коммуникацию к другим СУБД, согласен приходится танцевать с бубнами. Mtgktem, еще раз вопрос: че вы привязались именно к TVF? хотите более менее нормально выстроить ломанную логику используйте хранимые процедуры, нахрена вам именно табличные функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=46&mobile=1&tid=1685463]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 153ms |
0 / 0 |