Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12

Правильно написать хранимую процедуру

23.09.2014, 15:52. Показов 1222. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
У меня есть представление OrderByTickets

В клиентской части я произвожу поиск по Ид, ФИО, телефон, Дата начала, Дата окончания,
и дальше идут типы билета а именноTR-разовый, TVD-выходного дня, TD-дневной, TP-полный и т.д.)
Я так понимаю что мне нужно передавать параметры
T-SQL
1
2
3
4
CREATE PROCEDURE FindByTickets
                @ID int, @Fio varchar, @Tel varchar, @sDate date, @eDate date
                ,@TR bit, @TVD bit, @TD bit, @TP bit
    AS
И тут стопор:
1) Как мне сделать LIKE по int? ругается что не varchar
2) Как сформировать строку условия в запросе в зависимости от параметров?
т.е. у меня должно проверятся:
Если TR=1 то к строке WHERE добавляем AND(Type='Разовый')
Если TVD=1 то + AND(Type='Разовый' AND type = 'Дневной')
и т.д.

И вообще можно ли объявить какую либо строковую переменную SQLString в неё собрать все условие и потом просто написать?
T-SQL
1
2
3
SELECT *
FROM OrderByTickets
WHERE SQLString
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2014, 15:52
Ответы с готовыми решениями:

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

Написать хранимую процедуру, подсчитывающую общее кол-во записей во всех таблицах текущей БД
Какая хранимая процедура подсчитывает количество всех записей базы данных?

Как написать правильно процедуру
CREATE PROCEDURE .(@tgod int, @tekmes nvarchar(50)) AS set nocount on insert into buw SELECT...

3
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
23.09.2014, 17:34  [ТС]
Или же мне нужно учесть все возможные случаи и написать с кучей IF...ELSE кучу SELECT`ов?

Добавлено через 1 час 22 минуты
После кропотливой работы получилось:
T-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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
ALTER PROCEDURE FindByTickets
                @ID int, @Fio varchar, @Tel varchar, @sDate date, @eDate date
                ,@TR bit, @TVD bit, @TD bit, @TP bit, @TVIP bit, @TStock bit
    AS
        DECLARE @WhereString varchar(100)
 
        if @TR = 1 begin
            set @WhereString  = ' AND (Name="Разовый"'
            if @TVD = 1 begin
                set @WhereString = @WhereString + ' OR Name="Выходного дня"'
                if @TD = 1 begin
                    set @WhereString = @WhereString + ' OR Name="Дневной")'
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end 
                else begin 
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end
            end
            else begin
                if @TD = 1 begin
                    set @WhereString = @WhereString + ' OR Name="Дневной")'
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end 
                else begin
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end
            end
        end
        else begin
             if @TVD = 1 begin
                set @WhereString  = ' AND (Name="Выходного дня"'
                if @TD = 1 begin
                    set @WhereString = @WhereString + ' OR Name="Дневной")'
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end 
                else begin
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end
            end 
            else begin
                if @TD = 1 begin
                    set @WhereString  = ' AND (Name="Дневной"'
                    if @TP = 1
                        set @WhereString = @WhereString + ' OR Name="Полный")'
                    else
                        set @WhereString = @WhereString + ')'
                end
                else begin
                    if @TP = 1
                        set @WhereString = @WhereString + ' AND Name="Полный"'
                    else
                        set @WhereString = @WhereString + ' AND (Name<>"Разовый" AND Name<>"Выходного дня" AND Name<>"Дневной" AND Name<>"Полный")' 
                end
            end
        end
        if @TVIP = 1 
            set @WhereString = @WhereString + ' AND vip=1'
        if @TStock = 1 
            set @WhereString = @WhereString + ' AND stock=1'
 
 
        
        SELECT  *
        FROM    OrderByTickets
        WHERE   ID LIKE '%'+cast(@ID as varchar)+'%' AND
            fio LIKE  '%'+@Fio+'%' AND
            tel LIKE '%'+@Tel+'%' AND
            start_date >= @sDate AND end_date <=  @eDate
И осталось 2 вопроса:
1) ID LIKE '%'+cast(@ID as varchar)+'%' как задать пустой параметр? если задаю '' получаю результат пустой.
2) как прикрутить к WHERE @WhereString
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
24.09.2014, 04:15
Цитата Сообщение от ivan.-94 Посмотреть сообщение
ID LIKE '%'+cast(@ID as varchar)+'%' как задать пустой параметр?
T-SQL
1
ID LIKE '%' + CAST(@ID AS VARCHAR) + '%' OR ID = ''
Цитата Сообщение от ivan.-94 Посмотреть сообщение
как прикрутить к WHERE @WhereString
T-SQL
1
2
3
4
5
6
7
8
DECLARE @SqlString NVARCHAR(MAX)
SET @SqlString = N'SELECT  *
        FROM    OrderByTickets
        WHERE   ID LIKE ''%''' + CAST(@ID AS NVARCHAR) + N'''%'' AND
            fio LIKE  ''%''' + CAST(@Fio AS NVARCHAR)+ N'''%'' AND
            tel LIKE ''%''' + CAST(@Tel AS NVARCHAR) + N'''%'' AND
            start_date >= ''' + CAST(@sDate AS NVARVHAR) + N''' AND end_date <=  ''' + CAST(@eDate AS NVARCHAR) + N''' ' + CAST(@WhereStr AS NVARCHAR)
EXEC sp_executesql @SqlString
1
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
24.09.2014, 16:12  [ТС]
kodv,
Спасибо огромное только вот работает так:
T-SQL
1
'...ID LIKE ''%'+'' + CAST(@ID AS NVARCHAR(MAX)) + N''+'%'' AND...'
а именно ''%'+'' так как LIKE должен быть '% %' а не ''%' '%''
И пришлось параметр ID сделать типа NVARCHAR(MAX) а не INT так как при выполнении функции CAST вместо пустой строки получался 0

Добавлено через 5 минут
А так же в формировании строки запроса изменил + CAST(@WhereStr AS NVARCHAR)
CAST(@WhereStr AS NVARCHAR(MAX)) так как прибавлялась строка не полностью
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2014, 16:12
Помогаю со студенческими работами здесь

Выполнить хранимую процедуру
Я написал хранимую процедуру в SQL SERVER 2008 R. А вот проверить ее выполнение не получается.

Установить breakpoint на хранимую процедуру
какой-нибудь тулзой по типу QA как нибудь можно так поставить breakpoint на stored procedure, чтобы она (эта тулза) висела себе в...

Передать фильтр в хранимую процедуру
Под вечер голова не соображает. Что нужно: сделать фильтр по нескольким параметрам. Что задумал сгенерировать блок WHERE и передать...

Добавление параметров в хранимую процедуру VS C#
Я ввожу значение в текстбокс и это значение пытаюсь добавить в параметры хранимой процедуры что бы выполнить запрос. Проблема в том, что...

Как вызвать хранимую процедуру?
У меня есть тригер, в нем я хочу из хранимой процедуры получить данные и записать это в переменную Declare @Key nvarchar(10); SET...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru