Нужно сравнить разницу в два ряда? - PullRequest
2 голосов
/ 09 февраля 2012

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

Мой стол:

CREATE TABLE dbo.tUserChanges
(
cID int IDENTITY (1,1),
cChangeDate DateTime,
cValueChanged varchar(30),
cPreviousValue bit,
cCurrentValue bit
)

В моей программе на C # пользовательская таблица должна обновляться при внесении изменений в пользователей.

Это делается с помощью хранимой процедуры:

CREATE PROCEDURE [dbo].[UUser]       
( 
 @User as varchar(15),   
 @UCode  AS int,      
 @UName  AS varchar(30),      
 @UID   AS  varchar(10),      
 @UPassword  AS varchar(15),      
 @UPMaintenance as bit,      
 @UClient  as bit,      
 @UFinancial  as bit,      
 @UViewReceiptImage bit,
 @UViewPayrollData bit
) 
AS
BEGIN
UPDATE  tUsers      
 SET        
 UName    = @UName,      
 UID    = @UID,      
 UPassword   = @UPassword,  UPMaintenance   = @UPMaintenance,       
 UClient    = @UClient,      
 UFinancial   = @UFinancial,
 UViewReceiptImage = @UViewReceiptImage,
 UViewPayrollData = @UViewPayrollData     
 WHERE UCode = @UCode 
END 

В таблице tUser больше значений, но для сохранения сортировки я удалил некоторые значения.

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

Я пробовал это, но я знаю, что есть лучший способ, и он также не дает требуемых результатов:

declare @i int
set @i = 0
declare @ColumnCount int
set @ColumnCount = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE  table_name = @UID)
declare @ColumnName varchar(30)
set @ColumnName = (select column_name from information_schema.columns  where table_name = 'tUsers' and ordinal_position = 14)

select UActivateLoan from tusers

while (@ColumnCount < @i)
Begin
    if((select @ColumnName from tUsers where UID = @UID) 
    <> (select @ColumnName from #myTemp where UID = @UID))
    Begin
        Insert into tUserChanges
        Values(GETDATE(),(select column_name from information_schema.columns  where table_name = 'tUsers' and ordinal_position = 14),
                (select(select column_name from information_schema.columns  where table_name = 'tUsers' and ordinal_position = 14) from #myTemp where UID = @UID),
                (select(select column_name from information_schema.columns  where table_name = 'tUsers' and ordinal_position = 14) from tUsers where UID = @UID))
    END
    set @i = @i + 1
End

Я не уверен, нужно ли мне использовать курсор здесь или что я могу сделать, чтобы получить результат? Любая помощь будет оценена.

1 Ответ

2 голосов
/ 09 февраля 2012

Это было бы лучше сделать, используя триггер FOR UPDATE.

CREATE TRIGGER dbo.tUser_AfterUpdate ON dbo.tUsers FOR UPDATE AS 
BEGIN
  IF UPDATE(UName) THEN 
    INSERT INTO tUserChanges 
    SELECT GETDATE()
           , (SELECT UName FROM DELETED) -- Old Value
           , (SELECT UName FROM INSERTED) -- New Value

  ...
END

CREATE TRIGGER

Создает триггер, который является специальным видомхранимой процедуры, которая выполняется автоматически, когда пользователь пытается указать оператор изменения данных в указанной таблице.Microsoft® SQL Server ™ позволяет создавать несколько триггеров для любого заданного оператора INSERT, UPDATE или DELETE.

Изменить

Использование динамического SQL будетчто-то вроде

  CREATE TRIGGER dbo.tUser_AfterUpdate ON dbo.tUsers FOR UPDATE AS 
  BEGIN
    DECLARE @Columns TABLE (name sysname)
    DECLARE @ColumnName sysname
    DECLARE @Statement VARCHAR(MAX)

    INSERT INTO @Columns
    SELECT  name
    FROM    sys.columns
    WHERE   OBJECT_NAME(OBJECT_ID) = 'tUsers'

    WHILE EXISTS (SELECT * FROM @Columns)
    BEGIN 
      SELECT TOP 1 @ColumnName = name FROM @Columns
      DELETE FROM @Columns WHERE name = @ColumnName

      SET @Statement = 
        'IF UPDATE(' + @ColumnName + ') THEN '
        + 'INSERT INTO tUserChanges '
        + 'SELECT GETDATE() '
        + '      , (SELECT ' + @ColumnName + 'FROM DELETED) -- Old Value'
        + '      , (SELECT ' + @ColumnName + 'FROM INSERTED) -- New Value'

      EXEC (@Statement)
    END
  END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...