Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
В моей задаче необходимо передать в хранимую процедуру в качестве параметра имя таблицы и имя поля. Поскольку в MS SQL7.0 нет макроподстановок, то приходится все делать через EXECUTE. Хранимая процедура у меня фактически состоит из 3 команд DECALRE @cString VarChar(1000) SET @cString = '...' EXECUTE(@cString) Так вот, если я использую такую процедуру для возврата некоторой выборки, то никаких проблем. Все замечательно работает. Но если мне необходимо вызвать эту хранимую процедуру из другой хранимой процедуры, т.е. использовать RETURN, то я получаю сообщение об ошибке - дескать команду RETURN можно использовать только в хранимой процедуре. Собственно, это правильно, ведь фактически у меня получается RETURN внутри EXECUTE() - чего быть не должно. Но как в таком случае можно организовать возврат значения в другую ХП? Использовать глобальные временные таблицы очень бы не хотелось. Есть какое-нибудь решение для MS SQL 7.0? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2002, 09:47 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
>Так вот, если я использую такую процедуру для возврата некоторой выборки, >то никаких проблем. Все замечательно работает. Что именно (значение или набор) нужно вернуть из процедуры с EXECUTE()? Не надо использовать RETURN не по назначению(он используется исключитльно для возврата целочисленного кода завершения): The RETURN statement unconditionally terminates a query, stored procedure, or batch. None of the statements in a stored procedure or batch following the RETURN statement are executed. ... Most stored procedures follow the convention of using the return code to indicate the success or failure of the stored procedure. The stored procedures return a value of 0 when no errors were encountered. Any nonzero value indicates an error occurred, for example: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2002, 13:38 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
Идея в следующем - Есть некий набор операторов, в результате которых определяется значение кода одной записи (тип Integer). Эта последовательность используется несколько раз в одной хранимой процедуре. Возникает естесственное желание оформить эту последовательность отдельной функцией. Проблема в том, что имя таблицы и имя поля в которых и определяется это значение - передаются как параметры (большое количество однотипных таблиц - справочники) Каким образом можно реализовать эту задачу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2002, 14:17 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
Наступал я уже на эти грабли... Оформить в виде функции - это естественное желание. Только в функции нельзя использовать динамический SQL. Я выкрутился так. Содержимое вообще всех справочников у меня лежит всего в паре таблиц. В первую таблицу помещаются системные поля всех справочников плюс Lookup-поле (мы его еще называем "главным полем"). Системные поля - это идентификаторы справочника и записи, дополнительные системные поля для работы с древовидными справочниками, дата и время создания записи, информация о том, с какого компьютера и кем запись была создана. Главное поле (Lookup-поле) - это то поле, значение которого "светится" как выбранное в записи, ссылающейся на запись данного справочника. Lookup-поле обязано быть совместимым с varchar(). Все остальные поля (мы их называем additional-полями) помещаются во вторую таблицу и имеют тип sql_variaint. Значения разных полей одной записи справочника хранятся в разных записях таблицы №2. Для формирования собственно справочника со множеством полей используются View с instead-триггерами (View содержит столько Left join с таблицей №2, сколько additional-полей в справочнике). Текст VIEW и всех instead-триггеров строится автоматически с помощью специальной хранимой процедуры-скриптовалки по содержимому таблиц метаданных, в которых описана структура справочников. Модификация структуры справочника сводится к перескриптованию VIEW и instead-триггеров (удаление их и повторное создание). При этом все данные в справочнике остаются в целости и сохранности. Более того, есть возможность восстановить удаленное поле справочника вместе со всем его содержимым даже после его "удаления" из структуры справочника. Отсутствуют проблемы со множествами вариантов всяких ALTER TABLE..., которые во всех комбинациях пришлось бы перебирать в зависимости от разных вариантов модификации струтктуры. К тому же, на выполнение ALTER TABLE существует море всяких ограничений и требований в последовательности выполнения определенных операций. В частности, могут возникнуть серьезные проблемы с динамическим скриптованием, если таблица содержит в каком-либо поле в качестве default-значения вызов UDF, которая обращается к этой же самой таблице. При создании таблицы - настоящий танец с бубном. Сначала нужно создать таблицу без дефаулт-значения, потом создать функцию, и наконец с помощью Alter table подсунуть UDF в качестве default в таблицу. Более того, в качестве решения проблемы с Default-значениями, я использовал специфический подход. Default-зачения хранятся в таблицах метаданных, и обращение к ним производится с клиента в момент попытки добавить новую запись. В результате юзер видит дефаулт-значение в форме у себя на экране именно в том виде, как оно будет добавлено в таблицу еще до того, как произойдет собственно добавление записи , а не после него. Ну, на самом деле все сказанное - это очень упрощенный взгляд на проблему. На самом деле таблиц не две, а больше. Еще в паре таблиц я храню историю модификации записей справочников. Среди справочников есть ряд "системных" справочников, которые "вписаны" в обощенные алгоритмы работы всех остальных справочников. Таковым, например, является справочник свойств. Свойства - это динамически прицепливаемые к записям атрибуты, которые в древовидных справочниках с использованием иерархии справочника и механизма наследования свойств по этой иерархии позволяют творить настоящие чудеса. В частности, юзеры сами могут расписать структуру атрибутов для записей в разных ветвях одного и того же древовидного справочника. В результате в разных частях одного и того же справочника записи имеют разные атрибуты (вроде как разный состав полей). По свойствам работают фильтры, сортировка, поиск точно так же как и по полям. Только перечень полей жестко фиксирован, а состав свойств и их значение может быть модифицировано для любой записи справочника прямо во время текущей работы пользователя, без перехода в какие-либо режимы "конструктора". В своих проектах мы стараемся чаще использовать свойства и реже поля. Дело еще в том, что поля (особенно, если много и полей, и записей) достаточно долго закачиваются с сервера, что приводит к притормаживаниям вывода справочника (поля выводятся в гриде). А свойства выводятся в отдельном фрэйме окна справочника только для одной - текущей записи. В результате использование справочника со свойствами наиболее отвечает концепции тонкого клиента - загрузка информации с сервера на клиент производится мелкими порциями и только той информации, которая в данный момент требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2002, 18:29 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
2Garya Уважаемый!!! Распечатал Ваш пост на бумаге и пытаюсь осмыслить его!!! Я сечас работаю над созданием структуры для расчета косвенных затрат предприятия, ну уж очень мудрено там получается. Вот я и подумал, может Ваши идеи помогут мне. А можно ли увидеть Вашу структуру, ну наглядно что ли, в виде скрипта или в виде рисунка (erwin например). Может даже почтой [sav@kramz.rusal.ru] Александр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2002, 03:16 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
2Garya (вдогонку) Особенно интересно разобраться с таблицей (таблицами) метаданных, с описанием структуры справочников, позволяющей автоматически генерить VIEW и триггера, а так же ХП которая делает это. С другой стороны, как мне показалось, структура (или просто состав) справочника (количество свойств-полей) описаны в самом же справочнике в виде служебной информации. Ну очень интересно!!! Если конечно можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2002, 03:59 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
2 Gary Ваш ответ похож на анекдот о новом русском у которого засорилась пепельница в автомобиле и он решил купить новый автомобиль. Была у меня идея создания метаданных (что собственно Вы и реализовали), однако, пока решил от этого отказаться. Динамический SQL создать как раз можно через формирование символьной строки и выполнение ее через EXECUTE. Проблема в том, что в такой постановке EXECUTE - это закрытый пакет. Он "не видит" внешних данных и ничего не передает во вне. В качестве контейнера для обмена данными с "внешним миром" я нашел только использование таблиц (постоянных или глобальных временных). Но такой способ обмена чреват конфликтами совместного доступа. Т.е. данные записал один пользователь, а считал другой, что в данном случае - недопустимо! Конечно, можно решить вопрос о создании функции через обработку безусловных переходов GOTO в основной хранимой процедуре. Но тоже, какое-то кривое решение 2 ALL Неужели нет других решений ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2002, 09:24 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
По поводу использования динамических запросов опубликована статья на этом сайте (от 01.03.2002) http://www.sql.ru/articles/mssql/02030102WhenToUseDynamicSQL.shtml ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2002, 09:53 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
для обмена данными с "внешним миром" я нашел только использование таблиц (постоянных или глобальных временных) Локальные временные таблицы тоже можно использовать. create table #temp1 ... insert #temp1 exec('....') Неужели нет других решений ? Так подойдет ? declare @val varchar(50) declare @mysql nvarchar(4000) set @mysql = 'select @val=name from sysobjects where id=1') select @val exec sp_executesql @mysql, N'@val varchar(50) out', @val = @val out select @val ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2002, 11:19 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
Большое спасибо! То что нужно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2002, 11:37 |
|
||
|
Execute & Return
|
|||
|---|---|---|---|
|
#18+
>Ваш ответ похож на анекдот о новом русском у которого засорилась пепельница в автомобиле и он решил купить новый автомобиль Не спорю, похож. О концепции используемых мной макрообъектов я уже несколько раз высказывался. И так же несколько раз предупреждал о том, что трудоемкость реализации этой концепции сравнима с выкапыванием чайной ложкой тунеля сквозь гору. Но когда все уже сделано... Это так классно! Справочники у нас уже сделаны, в настоящий момент идет работа над другими макрообъектами. Но когда я создаю новый справочник (или проекцию на существующий справочник - это последнее слово в нашей концепции справочников), либо модифицирую структуру существующего справочника, я просто пищу от удовольствия. >Особенно интересно разобраться с таблицей (таблицами) метаданных, с описанием структуры справочников, позволяющей автоматически генерить VIEW и триггера, а так же ХП которая делает это Текст ХП занимает около 2000 строк. При создании справочника она генерит 4 VIEW и 9 Instaed-триггеров, размер которых зависит от типов полей справочника (кроме скалярных типов есть, например, тип "множество" и тип "ссылка на справочник") и их количества, а также от того, является справочник линейным или древовидным и задействован ли в нем механизм свойств. Размер простого триггера (не instead), прицепленного к главной таблице составляет около 1500 строк. И т.д. и т.п. Мы убили груду времени, чтобы все это накропать. Однако, чтобы все это прочитать и с нуля разобраться, IMHO, времени нужно еще больше . Замечу на всякий случай, что гигантские тексты триггеров и хранимых процедур не считаю достоинством концепции. Наоборот, в плане быстродействия подобные монстры требуют установки на сервере штабелей оперативной памяти, чтобы быстродействие устраивало пользователей. Гибкость бесплатно не дается. С другой стороны, нам удалось избежать использования динамического SQL, что позволило интегрировать собственные средства безопасности в среду безопасности SQL-сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2002, 13:16 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32025886&tid=1823412]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 255ms |
| total: | 412ms |

| 0 / 0 |
