Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Работа с триггерами  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
ambarka_max
как я вижу расплачиваемся лишними операторными скобками
Если статусы, отличные от 0 не интересуют, то можно и без операторных скобок.
26 авг 13, 17:09    [14756849]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
вот честно говоря, суровый идуcсский код
invm
while 1 = 1

дико раздражает

DECLARE my_Cursor CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
  SELECT .. FROM		


OPEN my_Cursor
FETCH NEXT FROM my_Cursor into ...
 WHILE @@FETCH_STATUS = 0 
  BEGIN 

	...

    FETCH NEXT FROM my_Cursor into ...
   END  
CLOSE my_Cursor
DEALLOCATE my_Cursor
26 авг 13, 17:23    [14756937]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
StarikNavy
вот честно говоря, суровый идуcсский код
invm
while 1 = 1
дико раздражает
Можно вместо этого метку поставить, а вместо конца цикла - GOTO
26 авг 13, 17:25    [14756954]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
занудам:
(код без необходимости отработки события "запрос ничего не вернул")
26 авг 13, 17:28    [14756978]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
за
iap
GOTO

меня линейкой по рукам били ;)
26 авг 13, 17:29    [14756987]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
StarikNavy
за
iap
GOTO

меня линейкой по рукам били ;)
А когда к месту - то ничего!
В триггере MSSQL как раз обычно к месту.

Это я как человек, отравленный Фортраном ©, говорю...
26 авг 13, 17:32    [14757002]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Раз уж тут всерьёз обсуждается возможность курсора в триггере с построчным вызовом процедуры,
то уже всё можно! Хуже не будет!
26 авг 13, 17:34    [14757009]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
StarikNavy
вот честно говоря, суровый идуcсский код
invm
while 1 = 1

дико раздражает

Меня не разражает, я обычно как Славик и Димон "очкую", у меня сразу мысль: ведь будет вечный цикл из-за какихнибудь кривых условий на break.
26 авг 13, 17:44    [14757067]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
ambarka_max
ведь будет вечный цикл из-за какихнибудь кривых условий на break.
А кривых условий на while, приводящих к "вечному" циклу не бывает? :)
26 авг 13, 18:16    [14757207]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
StarikNavy
вот честно говоря, суровый идуcсский код
invm
while 1 = 1

дико раздражает
По мне 2 раза FETCH раздражает больше, это же чистейший паст-копи, эталон индусского кода (впрочем, эталон - это весь курсор раскрыть паст-копи).

А while 1 = 1 всего лишь компенсация недостатка языка, было бы приятнее написать что то вроде:
WHILE FETCH NEXT FROM my_Cursor into ...
BEGIN
    ....
    ....
END
26 авг 13, 18:22    [14757233]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
У меня SQL 2005 Express . Делаю триггер для таблицы. Суть в том чтобы перебрать все добавленные записи (в них только колонку Код) и для каждого Кода запустить хранимую процедуру. Подскажите пожалуйста пример кода для переборки записей? Можно при помощи курсора. Только осваиваю язык. Большое спасибо.
27 авг 13, 10:55    [14759137]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Slash232
Только осваиваю язык

Осваивайте по документации http://msdn.microsoft.com/ru-ru/library/ms180169.aspx
27 авг 13, 10:57    [14759148]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Slash232
У меня SQL 2005 Express . Делаю триггер для таблицы. Суть в том чтобы перебрать все добавленные записи (в них только колонку Код) и для каждого Кода запустить хранимую процедуру. Подскажите пожалуйста пример кода для переборки записей? Можно при помощи курсора. Только осваиваю язык. Большое спасибо.
Ды вам всё рассказали, а в хелпе прямо есть такой пример - для каждой записи вызвать процедуру.

Что конкретно у вас не получается?
27 авг 13, 10:59    [14759161]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
alexeyvg
Что конкретно у вас не получается?
Вот я выше написал:
alexeyvg
- перебрать все вставленные записи: курсор по псевдотаблице INSERTED
- извлечь из каждой Код: SELECT или FETCH
- для каждой строки запустить процедуру с параметром Код: EXEC
Какой из этих трёх пунктов вызывает затруднения?
Покажите код, который вы пробуете написать, покажите результат выполнения этого кода.
27 авг 13, 11:01    [14759179]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Declare c1 CURSUR
for select [Код товара] from inserted
open c1

это начало а дальше я не могу понять как перебирать записи в этом курсоре?
27 авг 13, 11:08    [14759239]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
CURSOR опечатался
27 авг 13, 11:09    [14759241]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
FETCH NEXT FROM c1 -------- это я так понимаю перемещение на следующую запись

Как тогда запустить цикл и какое должно быть условие?
27 авг 13, 11:10    [14759254]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Slash232
это начало а дальше я не могу понять как перебирать записи в этом курсоре?

Дочитать пример из ссылки до конца ?
27 авг 13, 11:11    [14759258]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Declare c1 CURSOR
for select [Код товара] from inserted
open c1
FETCH NEXT FROM c1
while @@Fetch_status=0
begin
execute prRecalculation c1.[Код товара]
FETCH NEXT FROM c1
end

Что не так делаю?
27 авг 13, 11:17    [14759294]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Slash232
Что не так делаю?

Хелп не читаете
Вы пример Б из ссылки видели вообще ?
27 авг 13, 11:18    [14759304]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Slash232
Declare c1 CURSOR
for select [Код товара] from inserted
open c1
FETCH NEXT FROM c1
while @@Fetch_status=0
begin
	execute prRecalculation c1.[Код товара]
	FETCH NEXT FROM c1
end


Что не так делаю?


execute prRecalculation c1.[Код товара] — так не работает.

Заведите переменную для c1.[Код товара], считывайте значения в переменную при помощи инструкции FETCH ... INTO, в процедуру prRecalculation передавайте эту переменную.

И пользуйтесь тегом SRC для оформления кода :-)
27 авг 13, 11:25    [14759336]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Slash232
FETCH NEXT FROM c1 -------- это я так понимаю перемещение на следующую запись
Вы недопонимаете.
FETCH
получает определенную строку из серверного курсора Transact-SQL.
27 авг 13, 11:30    [14759365]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Slash232
Member

Откуда: Минск
Сообщений: 407
Declare @Code int
Declare c1 CURSOR
for select [Код товара] from inserted
open c1
FETCH NEXT FROM c1 into @Code
while @@Fetch_status=0
begin
execute prRecalculation @Code
FETCH NEXT FROM c1 into @Code
end
close c1

Сделал так но когда добавляю записи(сразу несколько одним запросом) то ругается что такой курсор уже существует. Подскажите какой код добавить чтобы триггер дожидался пока завершится выполнение процедуры которую я запускаю?
27 авг 13, 12:12    [14759679]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Glory
Member

Откуда:
Сообщений: 104751
Б.Использование вложенных курсоров для вывода отчета

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

SET NOCOUNT ON;

DECLARE @vendor_id int, @vendor_name nvarchar(50),
    @message varchar(80), @product nvarchar(50);

PRINT '-------- Vendor Products Report --------';

DECLARE vendor_cursor CURSOR FOR 
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID;

OPEN vendor_cursor

FETCH NEXT FROM vendor_cursor 
INTO @vendor_id, @vendor_name

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT ' '
    SELECT @message = '----- Products From Vendor: ' + 
        @vendor_name

    PRINT @message

    -- Declare an inner cursor based   
    -- on vendor_id from the outer cursor.

    DECLARE product_cursor CURSOR FOR 
    SELECT v.Name
    FROM Purchasing.ProductVendor pv, Production.Product v
    WHERE pv.ProductID = v.ProductID AND
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor

    OPEN product_cursor
    FETCH NEXT FROM product_cursor INTO @product

    IF @@FETCH_STATUS <> 0 
        PRINT '         <<None>>'     

    WHILE @@FETCH_STATUS = 0
    BEGIN

        SELECT @message = '         ' + @product
        PRINT @message
        FETCH NEXT FROM product_cursor INTO @product
        END

    CLOSE product_cursor
    DEALLOCATE product_cursor
        -- Get the next vendor.
    FETCH NEXT FROM vendor_cursor 
    INTO @vendor_id, @vendor_name
END 
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;
27 авг 13, 12:13    [14759691]     Ответить | Цитировать Сообщить модератору
 Re: Работа с триггерами  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Slash232
Declare c1 CURSOR LOCAL

ругается что такой курсор уже существует

Тег SRC так и не удалось освоить?
27 авг 13, 12:26    [14759801]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить