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

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

Мне необходиом получить две таблицы (deleted/inserted) после обновления основной таблицы в формате (ColumnName, ColumnValue)
Сейчас реализовал таким говнокодом:
+
CREATE TABLE #t (ID int, Name nvarchar(50), Value float, pID uniqueidentifier)
Insert Into #t 
			SELECT 1, 'test', 12.567, NEWID()

declare @ObjName nvarchar(max),
		@sql nvarchar(max),
		@Param nvarchar(max) = '@ObjName nvarchar(max) OUTPUT'

Set @sql =
('
	USE tempdb

	Set @ObjName = OBJECT_NAME(OBJECT_ID(N''#t''))
')
Exec sp_executesql @sql, @Param, @ObjName = @ObjName OUTPUT

declare @Add_Columns_deleted nvarchar(max),
		@Add_Columns_inserted nvarchar(max),
		@Columns_deleted nvarchar(max),
		@Columns_inserted nvarchar(max)

SELECT @Add_Columns_deleted = COALESCE(@Add_Columns_deleted +'; ALTER TABLE #tt ADD '+ COLUMN_NAME +'_deleted nvarchar(max)', 'ALTER TABLE #tt ADD '+ COLUMN_NAME +'_deleted nvarchar(max)'),
	   @Columns_deleted = COALESCE(@Columns_deleted +', '+ COLUMN_NAME +'_deleted', COLUMN_NAME +'_deleted')
FROM tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @ObjName

SELECT @Add_Columns_inserted = COALESCE(@Add_Columns_inserted +'; ALTER TABLE #tt ADD '+ COLUMN_NAME +'_inserted nvarchar(max)', 'ALTER TABLE #tt ADD '+ COLUMN_NAME +'_inserted nvarchar(max)'),
	   @Columns_inserted = COALESCE(@Columns_inserted +', '+ COLUMN_NAME +'_inserted', COLUMN_NAME +'_inserted')
FROM tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @ObjName

CREATE TABLE #tt (#ID int)

Exec
('
	'+ @Add_Columns_deleted  +'; 
	'+ @Add_Columns_inserted +'; 
	ALTER TABLE #tt DROP COLUMN #ID
')

UPDATE #t
	   SET ID = 578,
		   Value = 159.789,
		   pID = NEWID()
OUTPUT deleted.*, inserted.* INTO #tt

Exec
('
	SELECT ColumnName, ColumnValue
	FROM #tt
	UNPIVOT (ColumnValue FOR ColumnName IN ('+ @Columns_deleted +')) AS Data
	WHERE ColumnName LIKE ''%_deleted''
')

Exec
('
	SELECT ColumnName, ColumnValue
	FROM #tt
	UNPIVOT (ColumnValue FOR ColumnName IN ('+ @Columns_inserted +')) AS Data
	WHERE ColumnName LIKE ''%_inserted''
')

DROP TABLE #t
DROP TABLE #tt


Можно это как то получить стандартными средствами сразу в OUTPUT или нет?
16 июл 14, 12:41    [16311726]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в OUTPUT(deleted/inserted)  [new]
Max_Tpop
Member

Откуда:
Сообщений: 103
Хотя можно получить и так:
+
CREATE TABLE #t (ID int, Name nvarchar(50), Value float, pID uniqueidentifier)
Insert Into #t 
			SELECT 1, 'test', 12.567, NEWID()

SELECT * INTO #tt FROM #t

UPDATE #t
	   SET ID = 578,
		   Value = 159.789,
		   pID = NEWID() 

SELECT * INTO #ttt FROM #t

SELECT *
FROM (SELECT CONVERT(nvarchar(50), ID) AS ID,
		     Name,
			 CONVERT(nvarchar(50), Value) AS Value,
			 CONVERT(nvarchar(50), pID) AS pID
	  FROM #tt) AS tt
UNPIVOT (ColumnValue FOR ColumnName IN (ID, Name, Value, pID)) AS Data

SELECT *
FROM (SELECT CONVERT(nvarchar(50), ID) AS ID,
		     Name,
			 CONVERT(nvarchar(50), Value) AS Value,
			 CONVERT(nvarchar(50), pID) AS pID
	  FROM #ttt) AS tt
UNPIVOT (ColumnValue FOR ColumnName IN (ID, Name, Value, pID)) AS Data

DROP TABLE #t
DROP TABLE #tt
DROP TABLE #ttt


Вопрос закрыт.
16 июл 14, 13:03    [16311938]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить