powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Execute & Return
11 сообщений из 11, страница 1 из 1
Execute & Return
    #32025797
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моей задаче необходимо передать в хранимую процедуру в качестве параметра
имя таблицы и имя поля.

Поскольку в MS SQL7.0 нет макроподстановок, то приходится все делать через
EXECUTE.

Хранимая процедура у меня фактически состоит из 3 команд

DECALRE @cString VarChar(1000)
SET @cString = '...'
EXECUTE(@cString)

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

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

Собственно, это правильно, ведь фактически у меня получается RETURN внутри
EXECUTE() - чего быть не должно. Но как в таком случае можно организовать
возврат значения в другую ХП? Использовать глобальные временные таблицы очень
бы не хотелось.

Есть какое-нибудь решение для MS SQL 7.0?
...
Рейтинг: 0 / 0
Execute & Return
    #32025842
Replicant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Так вот, если я использую такую процедуру для возврата некоторой выборки,
>то никаких проблем. Все замечательно работает.

Что именно (значение или набор) нужно вернуть из процедуры с 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:
...
Рейтинг: 0 / 0
Execute & Return
    #32025847
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея в следующем - Есть некий набор операторов, в результате которых определяется значение кода одной записи (тип Integer). Эта последовательность используется несколько раз в одной хранимой процедуре. Возникает естесственное желание оформить эту последовательность отдельной функцией.

Проблема в том, что имя таблицы и имя поля в которых и определяется это значение - передаются как параметры (большое количество однотипных таблиц - справочники)

Каким образом можно реализовать эту задачу?
...
Рейтинг: 0 / 0
Execute & Return
    #32025862
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наступал я уже на эти грабли... Оформить в виде функции - это естественное желание. Только в функции нельзя использовать динамический 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-зачения хранятся в таблицах метаданных, и обращение к ним производится с клиента в момент попытки добавить новую запись. В результате юзер видит дефаулт-значение в форме у себя на экране именно в том виде, как оно будет добавлено в таблицу еще до того, как произойдет собственно добавление записи , а не после него.
Ну, на самом деле все сказанное - это очень упрощенный взгляд на проблему. На самом деле таблиц не две, а больше. Еще в паре таблиц я храню историю модификации записей справочников. Среди справочников есть ряд "системных" справочников, которые "вписаны" в обощенные алгоритмы работы всех остальных справочников. Таковым, например, является справочник свойств. Свойства - это динамически прицепливаемые к записям атрибуты, которые в древовидных справочниках с использованием иерархии справочника и механизма наследования свойств по этой иерархии позволяют творить настоящие чудеса. В частности, юзеры сами могут расписать структуру атрибутов для записей в разных ветвях одного и того же древовидного справочника. В результате в разных частях одного и того же справочника записи имеют разные атрибуты (вроде как разный состав полей). По свойствам работают фильтры, сортировка, поиск точно так же как и по полям. Только перечень полей жестко фиксирован, а состав свойств и их значение может быть модифицировано для любой записи справочника прямо во время текущей работы пользователя, без перехода в какие-либо режимы "конструктора".
В своих проектах мы стараемся чаще использовать свойства и реже поля. Дело еще в том, что поля (особенно, если много и полей, и записей) достаточно долго закачиваются с сервера, что приводит к притормаживаниям вывода справочника (поля выводятся в гриде). А свойства выводятся в отдельном фрэйме окна справочника только для одной - текущей записи. В результате использование справочника со свойствами наиболее отвечает концепции тонкого клиента - загрузка информации с сервера на клиент производится мелкими порциями и только той информации, которая в данный момент требуется.
...
Рейтинг: 0 / 0
Execute & Return
    #32025870
AlexanderVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya
Уважаемый!!! Распечатал Ваш пост на бумаге и пытаюсь осмыслить его!!! Я сечас работаю над созданием структуры для расчета косвенных затрат предприятия, ну уж очень мудрено там получается. Вот я и подумал, может Ваши идеи помогут мне.
А можно ли увидеть Вашу структуру, ну наглядно что ли, в виде скрипта или в виде рисунка (erwin например). Может даже почтой [sav@kramz.rusal.ru]

Александр.
...
Рейтинг: 0 / 0
Execute & Return
    #32025871
AlexanderVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Garya (вдогонку)
Особенно интересно разобраться с таблицей (таблицами) метаданных, с описанием структуры справочников, позволяющей автоматически генерить VIEW и триггера, а так же ХП которая делает это.
С другой стороны, как мне показалось, структура (или просто состав) справочника (количество свойств-полей) описаны в самом же справочнике в виде служебной информации.
Ну очень интересно!!! Если конечно можно.
...
Рейтинг: 0 / 0
Execute & Return
    #32025886
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Gary

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

Была у меня идея создания метаданных (что собственно Вы и реализовали), однако, пока решил от этого отказаться.

Динамический SQL создать как раз можно через формирование символьной строки и выполнение ее через EXECUTE.

Проблема в том, что в такой постановке EXECUTE - это закрытый пакет. Он "не видит" внешних данных и ничего не передает во вне. В качестве контейнера для обмена данными с "внешним миром" я нашел только использование таблиц (постоянных или глобальных временных). Но такой способ обмена чреват конфликтами совместного доступа. Т.е. данные записал один пользователь, а считал другой, что в данном случае - недопустимо!

Конечно, можно решить вопрос о создании функции через обработку безусловных переходов GOTO в основной хранимой процедуре. Но тоже, какое-то кривое решение

2 ALL

Неужели нет других решений ?
...
Рейтинг: 0 / 0
Execute & Return
    #32025890
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу использования динамических запросов опубликована статья на этом сайте (от 01.03.2002)

http://www.sql.ru/articles/mssql/02030102WhenToUseDynamicSQL.shtml
...
Рейтинг: 0 / 0
Execute & Return
    #32025903
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для обмена данными с "внешним миром" я нашел только использование таблиц (постоянных или глобальных временных)

Локальные временные таблицы тоже можно использовать.
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
...
Рейтинг: 0 / 0
Execute & Return
    #32025907
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо! То что нужно!
...
Рейтинг: 0 / 0
Execute & Return
    #32026019
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Ваш ответ похож на анекдот о новом русском у которого засорилась пепельница в автомобиле и он решил купить новый автомобиль

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

>Особенно интересно разобраться с таблицей (таблицами) метаданных, с описанием структуры справочников, позволяющей автоматически генерить VIEW и триггера, а так же ХП которая делает это

Текст ХП занимает около 2000 строк. При создании справочника она генерит 4 VIEW и 9 Instaed-триггеров, размер которых зависит от типов полей справочника (кроме скалярных типов есть, например, тип "множество" и тип "ссылка на справочник") и их количества, а также от того, является справочник линейным или древовидным и задействован ли в нем механизм свойств.
Размер простого триггера (не instead), прицепленного к главной таблице составляет около 1500 строк. И т.д. и т.п. Мы убили груду времени, чтобы все это накропать. Однако, чтобы все это прочитать и с нуля разобраться, IMHO, времени нужно еще больше . Замечу на всякий случай, что гигантские тексты триггеров и хранимых процедур не считаю достоинством концепции. Наоборот, в плане быстродействия подобные монстры требуют установки на сервере штабелей оперативной памяти, чтобы быстродействие устраивало пользователей. Гибкость бесплатно не дается. С другой стороны, нам удалось избежать использования динамического SQL, что позволило интегрировать собственные средства безопасности в среду безопасности SQL-сервера.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Execute & Return
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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