Сохранение вставленных и удаленных таблиц в переменные для использования в коде .NET (через sp_oamethod) [SQL Server 2000] - PullRequest
0 голосов
/ 26 октября 2009

Я пытаюсь создать триггер SQL в SQL Server, который каким-то образом сериализует вставленные и удаленные таблицы для использования в коде .NET (через sp_oamethod). Я хотел бы, чтобы это было достаточно универсальным, чтобы использовать его для любой таблицы.

Моя первая попытка была связана с использованием "for xml" для сериализации в XML и передачи в код .NET. Однако я не смог назначить XML для переменной, так как он не поддерживается в SQL Server 2000 (2005 для нас еще не вариант). Единственный вариант - выполнить сериализацию вручную (см. сохранение результатов FOR XML AUTO в переменную в SQL ), и это не соответствует моим требованиям универсальности.

--This does not work
declare @OldValue varchar(5000)
select @OldValue = (select * from Deleted for XML auto)

Кто-нибудь знает способ сделать это в общем, используя любой метод? Меня не волнует формат, если я могу получить имена и значения столбцов в своем коде .NET.

Ответы [ 2 ]

1 голос
/ 26 октября 2009

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

Я бы рекомендовал не делать этого в триггере, особенно в sp_OA *. Можете ли вы выполнить то, что вам нужно, поставив в очередь результаты из вставленных и удаленных таблиц в промежуточной таблице и имея данные или службу Windows, обрабатывающую данные?

0 голосов
/ 26 октября 2009

Можете ли вы сделать это без переменной, например:

select * from Deleted for XML auto

Так, что триггер возвращает набор результатов XML?

В качестве альтернативы, в пределах триггера:

declare @tablename varchar(256) 
set @tablename = quotename(object_name(@@procid)+'_'+convert(varchar,@@spid))
select * into #inserted from inserted
exec ('select * into '+@tablename+' from #inserted')
exec dbo.myGenericXML_generator @tablename
exec ('drop table '+@tablename)

Вроде барокко, но если у вас достаточно маленький объем, он может сработать. Вы также хотели бы добавить обработку ошибок, это просто передает идею.

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

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

...