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

Откуда:
Сообщений: 46
Вот такая часть кода в триггере на удаление работает, т.е. переменные из таблицы deleted заполняются:
	SET @Command = 
	N'
	IF EXISTS (SELECT objectID FROM  '+@BaseName+'.[dbo].[Table] WHERE objectID = @ID)  
			DELETE FROM '+@sBaseName+'.[dbo].[Table] WHERE [ObjectID] = @ID'

	EXEC sp_executesql @Command, N'@ID uniqueidentifier', @ID = @ID



Аналогичный подход к тригеру на вставку не прокатит, т.к. в sp_executesql @Command нужно брать данные из inserted.

Создавать переменные и заполнить по количеству полей, если их много (при условии что вставка всегда только 1 записи)...
Есть ли способ изящнее?
9 янв 13, 16:27    [13742472]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
ВладимирК
Вот такая часть кода в триггере на удаление работает, т.е. переменные из таблицы deleted заполняются:
	SET @Command = 
	N'
	IF EXISTS (SELECT objectID FROM  '+@BaseName+'.[dbo].[Table] WHERE objectID = @ID)  
			DELETE FROM '+@BaseName+'.[dbo].[Table] WHERE [ObjectID] = @ID'

	EXEC sp_executesql @Command, N'@ID uniqueidentifier', @ID = @ID



Аналогичный подход к тригеру на вставку не прокатит, т.к. в sp_executesql @Command нужно брать данные из inserted.

Создавать переменные и заполнить по количеству полей, если их много (при условии что вставка всегда только 1 записи)...
Есть ли способ изящнее?


P.S. Прошу прощения, @sBaseName (очипятка) - конечно же @BaseName
9 янв 13, 16:34    [13742542]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
1. Откуда берется @BaseName?
2. SELECT @@version?
9 янв 13, 16:40    [13742597]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

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

1. Вычисляется из определенного набора значений, т.е. в тригер выше (условно говоря по имени пользователя определятся конкретная БД с которой потом оперируем):
SELECT @ID = objectid, @SystemUser = SystemUser, 
		@BaseName = CASE 
         WHEN SystemUser = '2E6A4334-70DA-4C39-9F27-053A484FE893' THEN 'Base1'
         WHEN SystemUser = '754A55F2-C523-48B4-8817-31951AAFABE6' THEN 'Base2'
         WHEN SystemUser = 'FDE0F6A0-272F-45E0-982F-0C8EEA9B01DE' THEN 'Base3'
         WHEN SystemUser = 'A66B62E9-8894-4A79-987A-EB23D29BEA6C' THEN 'Base4'
         WHEN SystemUser = '33C5118D-706C-4CA1-8B69-C766253F3897' THEN 'Base5'
         WHEN SystemUser = '06A7AADF-CDBC-4DD5-8E1E-D49D5F227BDC' THEN 'Base6'
         WHEN SystemUser = 'D4FD52CC-4BFB-45D0-80FA-14FEEDB5997E' THEN 'Base7'
         ELSE '' END FROM DELETED

	IF LEN(@BaseName) > 0 SET @BaseName = QUOTENAME(@BaseName)


2. 2005
9 янв 13, 16:46    [13742670]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
ВладимирК,

Если вопрос в том, каким образом данные из DELETED и INSERTED передать в sp_executesql?

то что нибудь в таком духе можно:


create table test (i int)
go
alter trigger trgtest on test for insert, update, delete
as begin
	select * into #test_d from deleted
	select * into #test_i from inserted
	exec ('
	select * from #test_d
	union all
	select * from #test_i
	')
end
9 янв 13, 17:01    [13742794]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Алексей Куренков,

и еще - забыл )))) мовитон оставлять за собой временные таблицы - в конце триггера лучше их удалить
9 янв 13, 17:03    [13742814]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Если был бы 2008, то можно было посмотреть в сторону хп в каждой базе с параметром табличного типа.

ЗЫ. А зачем проверка наличия записи перед удалением? Чтоб серверу было чем заняться?
9 янв 13, 17:05    [13742837]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Алексей Куренков
и еще - забыл )))) мовитон оставлять за собой временные таблицы - в конце триггера лучше их удалить


BOL->CREATE TABLE:

Temporary tables are automatically dropped when they go out of scope.
9 янв 13, 17:09    [13742870]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
Алексей Куренков, спасибо!
Итого набираем 3 варианта:
1. С объявлением переменных (с перечислением всех полей) и присваиванием им значений из inserted
2. Обявление табличной переменной, так-же с необходимостью перечислять все поля
3. Данные из inserted передать во времнную таблицу

Есть еще варианты?:)
9 янв 13, 17:10    [13742877]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

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

А мы типа не уверены, что в той базе (с 1 по 7) такая запись есть (там ее могли хлопнуть:)), а тригер вызывается т.к. вызывается например в Base0
9 янв 13, 17:12    [13742899]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
ВладимирК
А мы типа не уверены, что в той базе (с 1 по 7) такая запись есть (там ее могли хлопнуть:))


И чем это чревато для просто

DELETE ... WHERE [ObjectID] = @ID


?
9 янв 13, 17:15    [13742919]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
ВладимирК,

На самом деле если даже и хлопнется эта запись, то удаления и не будет - команда удаления ничего не удалит. А лишняя предварительная проверка это дополнительная операция, причем в триггере. Согласен абсолютно что чуточку можно оптимизировать - в удалении убрав предварительную проверку
9 янв 13, 17:15    [13742923]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
pkarklin,
я понимаю о чем вы... типа "нет, так нет - пройдем мимо".... просто содержание @command на самом деле иное...для простоты восприятия так "подрезалось", но ведь и суть вопроса в другом:)
9 янв 13, 17:21    [13742963]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
Glory
Member

Откуда:
Сообщений: 104760
exec @module_name_var @ID = @ID
В переменной @module_name_var должно быть имя процедуры из нужной базы
Эта процедура и должна произвести нужные действия.
9 янв 13, 17:26    [13742982]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
ВладимирК
но ведь и суть вопроса в другом:)


Сам по себе динамический SQL в триггере - моветон.
9 янв 13, 17:27    [13742986]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
Если углубляться...то здесь рабочая идея в том, что надо удаляя запись в некой сводной Базе0 зависимости от опрделенного пользователя обратиться к соответствующей этому пользователю Базе... и там в аналогичной таблице удалить аналогичную запись, если она есть

А дальше вопрос был...как изящнее сделать вставку с аналогичными условиями:)
9 янв 13, 17:30    [13743004]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

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

Спасибо! Поставраюсь быть культурным!
9 янв 13, 17:33    [13743024]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
ВладимирК
А дальше вопрос был...как изящнее сделать вставку с аналогичными условиями:)


Ну так пусть у Вас будут процедуры в каждой бд для вставки и удаления с необходимым кол-вом параметров (раз уж версия не позволяет использовать табличные типы). И вызов

SET @Command = @BaseName + '.dbo.DropProc'
EXEC @Command @ID


не является DSQL.
9 янв 13, 17:34    [13743028]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
Glory,
Спасибо!
Это значит получается 4 вариант, но придется плодить ХП, в моем примере 7 баз
9 янв 13, 17:36    [13743043]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
Алексей Куренков
Member [заблокирован]

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

Даже не знал такой синтаксис ))))). Спасибо за инфу
9 янв 13, 17:39    [13743061]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
Спасибо всем Гуру!
5. Способ повысить версию сервера...
Вероятно тему можно закрыть
9 янв 13, 17:45    [13743097]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
ВладимирК
Спасибо всем Гуру!
5. Способ повысить версию сервера...

Не удержался... :)
6. Partition View - практически на любой версии сервера...
ВладимирК
Вероятно тему можно закрыть
9 янв 13, 18:08    [13743237]     Ответить | Цитировать Сообщить модератору
 Re: Оптимальный способ передачи данных из таблиц inserted в sp_executesql  [new]
ВладимирК
Member

Откуда:
Сообщений: 46
sphinx_mv
6. Partition View - практически на любой версии сервера...


Спасибо, интересный вариант, о котором лично я не подумал... А надо бы подумать!:)

Видимо как и во всем есть свои +/-... в моем примере базы (таблицы) идентичны, без ограничений CHECK...

1. ...если ограничения CHECK не определены, оптимизатор запросов будет вынужден выполнять поиск по всем таблицам, а не только по тем, которые соответствуют условию поиска по столбцу секционирования. Без ограничений CHECK представление будет функционировать как любое другое представление, созданное с использованием UNION ALL. Оптимизатор запросов не в состоянии делать предположения о диапазонах значений, хранящихся в различных таблицах, поэтому он не может исключить из поиска ни одну из таблиц, входящих в определение представления

2. Массовый импорт в секционированное представление не поддерживается ни командой bcp, ни инструкциями BULK INSERT и INSERT ... SELECT * FROM OPENROWSET(BULK...).
10 янв 13, 08:18    [13744758]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить