powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условия в SP
13 сообщений из 13, страница 1 из 1
Условия в SP
    #32006227
RoKo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, All!
Первый раз в этом форуме, так, что заранее извиняюсь за, возможно, уже прозвучавший вопрос. В VB я открывал рекордсет, предварительно подготавливая для него строку запроса, в зависимости от условий. Что-то типа:

S = "SELECT * FROM anytable"
If SomeValue <> "*" Then
S = S & " WHERE anyfield = " & SomeValue
End If
RS.Open S, ADOConnect

(простейший пример)
Теперь я стал круче и решил вынести запросы на сервер в хранимые процедуры. Собственно, вопрос: каким образом я могу в процедуре создать конечный SQL запрос, в зависимости от значений переменных, передаваемых в нее? Просьба вариант типа:

IF @SomeValue != '*'
BEGIN
SELECT * FROM anytable WHERE anyfield = @SomeValue
ELSE
SELECT * FROM anytable
END

...

IF ...
BEGIN
...
ELSE
...
END

и т.д. и т.п. не предлагать, потому, что таких условий тьма тьмущая.

Заранее спасибо.
P.S. Здорово тут у вас, а главное - все темы по теме в отличии от многих форумов.
...
Рейтинг: 0 / 0
Условия в SP
    #32006231
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже восхищаюсь данным форумом. Я в нем не давно, но успел узнать очень много нового.
CREATE procedure SelFromSomeTable(@TableName varchar(100), @Where varchar(1000))
as
declare @SQL varchar(1000)
create Table #TempTable(F1 varchar(100))
insert into #TempTable exec MyProc @TableName
set @SQL='select * from #TempTable ' + @Where
exec(@SQL)
drop table #TempTable
GO
Вот. как наверно по параметрам понятно, эта процедура возвращает данные из некоторой таблицы @TableName. Может возникнуть проблема с тем, что у временной таблицы(#TempTable) всего одно поле, но это решаемо.
...
Рейтинг: 0 / 0
Условия в SP
    #32006248
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 RoKo

и т.д. и т.п. не предлагать, потому, что таких условий тьма тьмущая.

"А Вам, Шариков, надо молчать и слушать, молчать и слушать!" (С)

"Камень, отложенный строителями, оказался во главе угла здания" (Это уже из Нового Завета)

Что хотим, то и предлагаем


CREATE procedure SelFromSomeTable @somevalue varchar(666) as
SELECT * FROM anytable where @somevalue='*' or anyfield =@somevalue
...
Рейтинг: 0 / 0
Условия в SP
    #32006265
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
Будем знать. Еще раз спасибо за опыт!
...
Рейтинг: 0 / 0
Условия в SP
    #32006266
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SergSuper
Будем знать. Еще раз спасибо за опыт!
...
Рейтинг: 0 / 0
Условия в SP
    #32006331
RoKo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Slava, 2SergSuper

Большое спасибо!
...
Рейтинг: 0 / 0
Условия в SP
    #32006339
andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, а собственно с чего вы взяли, что перенос логики по собиранию условий из скрипта в SP - это улучшение? Есть какие-то данные по сравнению производительности? Лично мой опыт показывает, что это все смена шила на мыло. Но при этом вы теряете в переносимости. А еще скрипты на .Нет будут компилиться.

Слава, а не могли бы вы пояснить мутилово со временной таблицей в вашем варианте. Я что-то никак не пойму зачем она там нужна . И почему нельзя просто ввести 3-й параметр @sFieldsToSelect (например: "item_id, item_name")? И что делает процедура MyProc?

> create Table #TempTable(F1 varchar(100))
> insert into #TempTable exec MyProc @TableName
...
Рейтинг: 0 / 0
Условия в SP
    #32006341
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
<Слава, а не могли бы вы пояснить мутилово со временной таблицей в вашем варианте.
Что-то в этом предложении не по русски. Смысл не ясен. Может это очень обидно для меня?
Поясняю. MyProc может возвращать данные из заранее неизвестной таблицы. Я ее ввел для улучшения читаемости кода. Если необходимо реализовать сложный алгоритм, то лучше это делать поэтапно(Deplhi5 научила). В варианте SergSuper все равно EXEC нажна. Я ее просто в другую процедуру вынес. Про временную таблицу объямнять не буду, если специально не попросите.
...
Рейтинг: 0 / 0
Условия в SP
    #32006441
andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Slava.
Обидеть не хотел, честое слово. Я просто не думал, что слово "мутилово" может кого-то обидеть.

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

DECLARE @tableName as nvarchar(50), @sqlStr as nvarchar(100)
SET @tableName=N'atable'
SET @sqlStr = N'select * from ' + @tableName
execute sp_executesql @sqlStr
?

Соответсвенно вместо * можно укзать список полей, ну и where добавить.

Насчет exec у СуперСерга, вроде бы его там не нужно, если я правильно понял, просто для каждого запроса надо будет писать свою SP, которая будет принимать свой набор параметров.

Так вот меня собственно интересует вот какой вопрос: а зачем вообще такую логику запихивать в хранимую процедуру?
...
Рейтинг: 0 / 0
Условия в SP
    #32006449
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 andy

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

С приветом Сергей

PS. А Slava работает просто на грани гениальности. Минут пять смотрел на его процедуру - так и не понял величия замысла
...
Рейтинг: 0 / 0
Условия в SP
    #32006455
andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 SuperSerg
Вопрос то этот я собственно задал потому, что в первом сообщении этой дискуссии RoKo пишет:

>Теперь я стал круче и решил вынести запросы на сервер в хранимые процедуры.

А мне вот и хочется разобраться чем же SP круче в данном случае. Если целью запихивания всех запросов в процедуры является создания некого универсального кода, который сможет работать с любыми базами (интересно, что в этом коде собственно останется? открытие и закрытие коннекшена видимо ).

Просто мне кажется, что критерий правильности здесь есть только один - скорость работы, если SP дают выигрыш в производительности, то их надо использовать, а нет...

А дальше, как правильно заметил СуперСерг, все зависит от ситуации.
...
Рейтинг: 0 / 0
Условия в SP
    #32006555
RoKo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Andy.

Можно флеймить по поводу рациональности/нерациональности того или иного поступка часами, так и не выразив какого-то конкретного мнения. Это, видимо, круто. Но, существуют обстоятельства, не зависящие от крутости критика. К таким относятся: а) недостаточная мощность аппаратного обеспечения (читай - компьютеров), конторы, в которой ты работаешь и на котором запускаются апп., написаные тобою же (есть и 486), а SQL Server стоит на PIII-850/256. Я думаю, в этом случае, рациональнее будет посылать на сервер по сети некий набор условий (а он немаленький - см. первое письмо), а уж сервер сам будет эти условия обрабатывать, чем терзать старенькую четверку множественными SELECT CASE/IF...END IF; б) вообще-то, не я один программер в нашем банке, есть люди, пишущие свои апп. на Delphi/VB - им тоже будет удобнее получать свой рекордсет по переданым условиям, минуя их обработку.

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

Извини, Andy, если чем-то задел тебя этим письмом. Предалагаю закрыть тему.
...
Рейтинг: 0 / 0
Условия в SP
    #32006647
andy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня это никак не задело.

Просто в сообщении было написано, что пример на ВБ, я по наивности решил, что это скрипт, который выполняется на сервере. И решил собственно вызнать, а чем же собственно лучше такого рода логику перекладывать в хранимые процедуры. Короче забей.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условия в SP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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