Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
Доброго дня господа !

Необходимо в процедуру в качестве параметра передавать таблицу
Структура таблицы динамична - это временная таблица тригеров INSERTED,DELETED

Подскажите возможно ли это ? А также синтаксис реализации такой процедуры.

Заранее благодарен !
12 июн 13, 23:21    [14425763]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Use Table-Valued Parameters (Database Engine)
12 июн 13, 23:23    [14425769]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
Maxx,

Принято - спасибо !
В MSQL2008 - такой механизм есть ?
или начиная с Версии 2012
12 июн 13, 23:47    [14425802]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4538
HOME_X
В MSQL2008 - такой механизм есть ?

ДА
HOME_X
Структура таблицы динамична - это временная таблица тригеров INSERTED,DELETED

Откуда эта мания к написанию универсальных триггеров... один икс - намаетесь потом... нужно будет заводить типы...
P.S. Можно тупо кидаться xml'ем
12 июн 13, 23:53    [14425811]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
buser
нужно будет заводить типы...

Согласен, но в моем случае события на INSERT и DELETE абсоллютно идентичны
соответственно имеет смысл иметь одну процедуры передав ей в качестве
параметра набор записей (таблицы INSERTED,DELETED) над которыми была проведена операция.


buser
P.S. Можно тупо кидаться xml'ем

Не могли бы привести пример (ссылку) - формирования XML,
перадачи в качестве парамтера,
разбор XML

Заранее благодарен !
13 июн 13, 00:06    [14425837]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4538
для затравки, все остальное... ну или нагуглите...
13 июн 13, 00:23    [14425875]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
buser,

Принято - спасибо !

А ведь можно сделать совсем просто - обьединить две таблицы триггера
(они имеют одинаковую структру ????)
И передавать никакой таблицы в виде параметра не надо .....

declare @Type int
set @Type = 1 - внешний параметр управления


select * from INSERTED where 1=@Type
union all
select * from DELETED where 0=@Type
13 июн 13, 03:17    [14426052]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
HOME_X,
НЕ - глупость сказать - функция все равно есть ....
13 июн 13, 03:19    [14426053]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
HOME_X,

в чём проблема-то?
Хотите один триггер на вставку и удаление,
но не знаете, как узнать что сработало?

Много раз обсуждалось. Например: Можно ли в триггере(for U,I,D) определить какое действие над табл. вызвало его?

Не надо никуда копировать inserted или deleted!
Ну представьте, что вставили миллиард записей!
А Вы это ещё копировать собираетесь!
13 июн 13, 09:54    [14426474]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
iap
но не знаете, как узнать что сработало?


Нет - у меня для INSERT и DELETE идентичные алгоритмы для обработки
только набор записей разный - вот и хочу его передать в процедуру...

Склоняюсь к XLM, может чего более умное есть
(с пользв. типов не понравилось)
13 июн 13, 10:43    [14426703]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
HOME_X
iap
но не знаете, как узнать что сработало?


Нет - у меня для INSERT и DELETE идентичные алгоритмы для обработки
только набор записей разный - вот и хочу его передать в процедуру...

Склоняюсь к XLM, может чего более умное есть
(с пользв. типов не понравилось)
Набор записей определяется предикатами в INSERT и DELETE,
которые привели к выполнению соответствующего триггера.
Про какую процедуру речь - вообще непонятно.
Пришло время от слов перейти к тексту триггера.
Здесь же не литературный форум, правда?

К примеру, что мешает текст процедуры вписать прямо в триггер?
13 июн 13, 11:18    [14426978]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
buser
для затравки, все остальное... ну или нагуглите...


C XML - результат получился
 declare  @xmlData xml
 set @xmlData  = (select A.F1 as '@F1',A.F2 as '@F2'
   from (values(1,'Hello'),
               (2,'Buhlo')
        ) A(F1,F2) for XML PATH('Record'), ROOT('Table')
  )      
  
  select @xmlData
  select Record.value('@F1', 'int') as Id,
         Record.value('@F2', 'nvarchar(50)') as CompanyName
    FROM @xmlData.nodes('/Table/Record') Col(Record)


Спасибо !!!!!!
13 июн 13, 12:16    [14427474]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
iap
что мешает текст процедуры вписать прямо в триггер?


Текст процедуры идентичный для тригерра INSERT и DELETE
разница только в записях, которые вносяться системой во временные
таблицы INSERTED,DELETED

Отсюда ОБЩАЯ процедура для двух событий, в нее надо передать набор
записей которые возникли при наступлении события

Пример прилагаю по INSERT
ALTER trigger [dbo].[MSP_PROJ_HIERARCHIES_Insert] on [dbo].[MSP_PROJ_HIERARCHIES]
for insert as
declare @Temp table(PARENT_PROJ_UID   UID,
                    CHILD_PROJ_UID    UID,
                    LT_STRUCT_UID     UID,
                    PARENT_PROJ_NAME  nVarchar(255),
                    CHILD_PROJ_NAME   nVarchar(255),
                    WRES_EMAIL        nVarchar(255)
                   ) 
insert into @Temp
select I.PARENT_PROJ_UID,
       I.CHILD_PROJ_UID,
       IsNull(S.LT_STRUCT_UID,N.LT_STRUCT_UID) LT_STRUCT_UID,
       Case when CharIndex('<CHOICE>'+P.PROJ_NAME+'</CHOICE>',M.tp_Fields)>0
            then P.PROJ_NAME else '<N/A>' end PROJ_NAME,
       C.PROJ_NAME,
       R.WRES_EMAIL
  from INSERTED I
  .................................
  .................................


Пример прилагаю по DELETE
ALTER trigger [dbo].[MSP_PROJ_HIERARCHIES_Delete] on [dbo].[MSP_PROJ_HIERARCHIES]
for delete as
declare @Temp table(PARENT_PROJ_UID   UID,
                    CHILD_PROJ_UID    UID,
                    LT_STRUCT_UID     UID,
                    PARENT_PROJ_NAME  nVarchar(255),
                    CHILD_PROJ_NAME   nVarchar(255),
                    WRES_EMAIL        nVarchar(255)
                   ) 
insert into @Temp
select I.PARENT_PROJ_UID,
       I.CHILD_PROJ_UID,
       IsNull(S.LT_STRUCT_UID,N.LT_STRUCT_UID) LT_STRUCT_UID,
       Case when CharIndex('<CHOICE>'+P.PROJ_NAME+'</CHOICE>',M.tp_Fields)>0
            then P.PROJ_NAME else '<N/A>' end PROJ_NAME,
       C.PROJ_NAME,
       R.WRES_EMAIL
  from DELETED I
  .................................
  .................................


Разница только в строках
from INSERTED I

from DELETED I

Хочу писать
ALTER trigger [dbo].[MSP_PROJ_HIERARCHIES_Insert] on [dbo].[MSP_PROJ_HIERARCHIES]
for insert as
exec My_Proc(Inserted)


ALTER trigger [dbo].[MSP_PROJ_HIERARCHIES_Delete] on [dbo].[MSP_PROJ_HIERARCHIES]
for delete as
exec My_Proc(Deleted)


create procedure My_Proc(@TriggerRecord ......)
declare @Temp table(PARENT_PROJ_UID   UID,
                    CHILD_PROJ_UID    UID,
                    LT_STRUCT_UID     UID,
                    PARENT_PROJ_NAME  nVarchar(255),
                    CHILD_PROJ_NAME   nVarchar(255),
                    WRES_EMAIL        nVarchar(255)
                   ) 
insert into @Temp
select I.PARENT_PROJ_UID,
       I.CHILD_PROJ_UID,
       IsNull(S.LT_STRUCT_UID,N.LT_STRUCT_UID) LT_STRUCT_UID,
       Case when CharIndex('<CHOICE>'+P.PROJ_NAME+'</CHOICE>',M.tp_Fields)>0
            then P.PROJ_NAME else '<N/A>' end PROJ_NAME,
       C.PROJ_NAME,
       R.WRES_EMAIL
  from @TriggerRecord I
  .................................
  .................................


достаточно ли подробно пояснил ?
13 июн 13, 12:28    [14427561]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
HOME_X,

триггер - это в какой-то степени тоже процедура.
Почему бы не создать триггер FOR INSERT, DELETE и написать в нём всё то же самое, что и в процедуре?
При вставке заполнена таблица inserted, а deleted - пуста.
При удалении - наоборот. В тексте триггера это легко использовать.
Зачем процедура - не понял.
13 июн 13, 12:48    [14427696]     Ответить | Цитировать Сообщить модератору
 Re: Параметр процедуры = таблица  [new]
HOME_X
Member

Откуда:
Сообщений: 2648
iap,

Спасибо !!!!!!!!!!
Самый простой вариант - САМЫЙ ВЕРНЫЙ !!!!!!!

select * from INSERTED
union all
select * from DELETED

ALTER trigger [dbo].[MSP_PROJ_HIERARCHIES_Insert] on [dbo].[MSP_PROJ_HIERARCHIES]
for insert,delete as
declare @Temp table(PARENT_PROJ_UID   UID,
                    CHILD_PROJ_UID    UID,
                    LT_STRUCT_UID     UID,
                    PARENT_PROJ_NAME  nVarchar(255),
                    CHILD_PROJ_NAME   nVarchar(255),
                    WRES_EMAIL        nVarchar(255)
                   ) 
insert into @Temp
select I.PARENT_PROJ_UID,
       I.CHILD_PROJ_UID,
       IsNull(S.LT_STRUCT_UID,N.LT_STRUCT_UID) LT_STRUCT_UID,
       Case when CharIndex('<CHOICE>'+P.PROJ_NAME+'</CHOICE>',M.tp_Fields)>0
            then P.PROJ_NAME else '<N/A>' end PROJ_NAME,
       C.PROJ_NAME,
       R.WRES_EMAIL
  from (select * from INSERTED
           union all
          select * from DELETED
         )


P.S. - и процедура не нужна (типа знал - он забыл)
13 июн 13, 13:55    [14428152]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить