Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 14.10.2015
Сообщений: 57
1
MS SQL

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

12.06.2016, 13:24. Показов 698. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
База данных написана полностью на хранимых процедурах. И с вызовом всех процедур не возникает проблем, кроме как с одной. Структура таблиц: mashinki (id_mash,n_mash,kl_fan,kl_ig,tandem,sost,kl_mash); sotr (id_sotr, fam, name, otch, tip_gr, n_tel, data_n< data_k, id_dol); rab_mesto (id_zap, id_sotr, id_mash). Связь в таблицах: sotr.od_sotr=rab_mesto.id_sotr and mashinki.id_mash=rab_mesto.id_mash.Структура такова, т.к. один и тот же человек может отвечать за несколько машинок, но за одну машинку может отвечать несколько человек (посменная цеха). Итак хранимая процедура вполне нормально отрабатывает на сервере, но при вызове ее с дэлфи (для отображения таблицы), после первого раза делфи пишет ошибку: "Неправильный синтаксис возле ключевого слова from", да но хоть 1000 раз вызови на сервере она отрабатывает нормально. Код хранимой процедуры:
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
87
88
89
90
91
92
93
94
95
96
97
ALTER procedure [dbo].[selrb]
    (
        @fam   nvarchar(20) = NULL,                 -- фамилия сотрудника (параметр может быть пустым)
        @name  nvarchar(20) = NULL,                 -- имя сотрудника (параметр может быть пустым)
        @otch  nvarchar(20) = NULL,                 -- отчество сотрудника (может быть пустым) 
        @tip_gr nvarchar(10) = NULL,                    -- тип графика (может быть пустым)
        @ids_mash integer = null
    )
    as
        begin
        declare @cont  int = null                       -- параметр для хранения максимального количества машинок в таблице машинок
        declare @i int = 0                              -- параметр итерации
        
        if @ids_mash is not null
                select @cont=COUNT(*) from mashinki where id_mash=@ids_mash -- присвоению параметру 
        else
                select @cont=COUNT(*) from mashinki         -- присвоению параметру 
            
                        
        declare @base nvarchar(max) = null              -- параметр для хранения текста динамического запроса
        declare @id_mash int = null                     -- идентификатор машинки
        declare @mash nvarchar(100) = null              -- параметр для хранения названия машинки
        DECLARE @piv nvarchar(max) = ''         -- переменная для занесения названия машинок (используется в pivot)
        DECLARE @column nvarchar(max)=''        -- переменная для занесения названия машинок (используется в динамическом запросе для формирования столбцов)
 
        if @ids_mash is not null
                    begin
                            declare cur cursor for
                            select  id_mash,(RTRIM(kl_fan)+' ('+RTRIM(kl_ig)+') '+RTRIM(kl_mash)+' '+'№'+RTRIM(convert(nvarchar,n_mash))) as mash
                            from mashinki where id_mash=@ids_mash           
                            order by n_mash
                    end
            else
                    begin
                                declare cur cursor for
                                select  id_mash,(RTRIM(kl_fan)+' ('+RTRIM(kl_ig)+') '+RTRIM(kl_mash)+' '+'№'+RTRIM(convert(nvarchar,n_mash))) as mash
                                from mashinki           
                                order by n_mash         
                    end     
 
                    open cur
 
                    while @@FETCH_STATUS = 0    
                        BEGIN                                                                                       
                    fetch next from cur into @id_mash,@mash                                                                                 
 
                                IF @i<@cont                         -- если итерация цикла не последняя , то 
                                    BEGIN
                                    SET @piv=@piv+'[' + RTRIM(@mash)+']'    -- формирование для pivot
                                    SET @column=@column+'replace(isnull(cast(cast(['+@mash+'] as bit) as nvarchar(1)),''-''),''1'',''+'') as ['+@mash+']'    -- формирование для столбцов
 
                                end
                                if @i<@cont-1   
                                    begin
                                        SET @piv=@piv+','       -- добавлять затую для PIVOT
                                        SET @column=@column+','     -- добавлять запятую  для столбцов
                                END                                 -- конец 
             
                                SET  @i=@i+1                                -- увеличение шага итерации  (счетчик цикла)
                        end     
                        
    
        SET @base='select id_sotr,fam,name,otch,tip_gr,'+@column                                    -- формированиие selecta и столбцов даты                                                          -- формирование динамического запроса
        SET @base=@base+' from (select sotr.fam,sotr.name,sotr.otch,sotr.tip_gr,rab_mesto.id_sotr,rab_mesto.id_mash,
                  (RTRIM(kl_fan)+'' (''+RTRIM(kl_ig)+'') ''+RTRIM(kl_mash)+'' ''+''№''+RTRIM(convert(nvarchar,n_mash))) as mash           
                            from mashinki,rab_mesto,sotr
                            where mashinki.id_mash=rab_mesto.id_mash and sotr.id_sotr=rab_mesto.id_sotr) as pr
                            pivot (max(id_mash) for mash in ('+@piv+')) as pvr
                    where 1=1 '
                            
 
        
 
                        
        close cur
        deallocate cur
        
 
 
        IF @fam IS NOT NULL                                     -- если параметр фамилию не  пуст,
            SET @base+=N' and fam=@fam'                         -- добавить значение в условие выборки по фамилии
            
        IF @name IS NOT NULL                                    -- если параметр имени не пуст,
            SET @base+=N' and name=@name'                       -- добавить значение в условие выборки по имени
 
        IF @otch IS NOT NULL                                    -- если параметр отчества  не пуст, 
            SET @base+=N' and otch=@otch'                       -- добавить значение в условии выборки по отчеству
        
        IF @tip_gr IS NOT NULL                                  -- если параметр графика не пуст, 
            SET @base+=N' and tip_gr=@tip_gr'                   -- добавить в условии выборки по графику
 
 
        
        
        
        end
   EXEC    sp_executesql @base,N' @fam nvarchar(20), @name nvarchar(20), @otch nvarchar(20),@tip_gr nvarchar(10)',@fam,@name,@otch,@tip_gr
я думаю может это из за того, что там содержится курсор?
вот результаты на сервере и в дэлфи:
После первого вызова хранимой процедуры показывает ошибку


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


После первого вызова хранимой процедуры показывает ошибку
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2016, 13:24
Ответы с готовыми решениями:

Зависание программы после вызова хранимой процедуры на сервере
Добрый день! Столкнулся с проблемой следующего характера: Вызываю хранимую процедуру на SQL...

Синтаксис вызова хранимой процедуры?
Подскажите, как вызвать хранимую процедуру MS SQL из ASP-а?

Как оформить код для вызова хранимой процедуры, содержащей инструкцию UPDATE
добрый день хп работает, код без ошибок, но не вносятся изменения в базу и все тут..не подскажете...

Delphi не возвращает ошибку при выполнении хранимой процедуры
Здравствуйте люди добрые. Подскажите пожалуйста как получить сведения об ошибке в Delphi через ADO,...

1
2 / 2 / 0
Регистрация: 14.10.2015
Сообщений: 57
12.06.2016, 14:19  [ТС] 2
Придумал решение, но оно немного корявое: добавил adoconnection именно на форму и подключил к нему adostoredproc, теперь жанглирую двумя компонентами при обновлении
0
12.06.2016, 14:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2016, 14:19
Помогаю со студенческими работами здесь

;1 после названия хранимой процедуры
Подскажите, зачем в ADODataSet при выборе хранимой процедуры после её имени delphi подставляет...

Создание хранимой процедуры с параметром определенным как массив строк, вызывает ошибку
Я создаю хранимую процедуру, чтобы она принимала в качестве параметра, массив строк Создал тип ...

Получить данные после выполнения хранимой процедуры в Perl.
Есть хранимая процедура (Сервер DB2) которая возвращает набор данных и есть такая необходимость...

Вызов процедуры после вызова макроса
Подскажите, как исправить следующую ошибку. Вызываю процедуру Execute для обработки данных. В...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru