У кого-нибудь есть решение для отправки параметра строки на хранимую процедуру в MS- SQL Server с динамической c колонной расстановкой? - PullRequest
0 голосов
/ 12 февраля 2020

Я мог бы написать триггер для таблицы, которая может обнаруживать обновленные столбцы и регистрирует изменения. Я хочу сделать хранимую процедуру из этого триггера и вызывать ее при необходимости. Но я не знаю, как я могу отправить «вставленные» или «обновленные» строки, которые действительны в теле триггера, этому SP. Вот мой триггер:

    CREATE TRIGGER [dbo].[tgr_MyTable_TransactionLogUpdate]
       ON  [dbo].[MyTable]
       AFTER UPDATE
    AS 
    BEGIN

    if (select F_SharhRadif from [Payeh.Decode] where F_ShJadval=18 and F_ShRadif=1)='2'
    begin
        return
    end

    declare @userid int=(select top 1 userid from inserted)
    declare @computername nvarchar(50)=(select top 1 computername from inserted)
    declare @ip nvarchar(50)=(select top 1 IP from inserted)
    declare @zamantaqeer datetime=(select top 1 F_ZamanTaqeer from inserted)
    declare @changetime =GETDATE()


    DECLARE @tableID        BIGINT=(SELECT id FROM sys.sysobjects WHERE [name]='MyTable')
    DECLARE @ColCount       INT=(SELECT COUNT(*) FROM sys.syscolumns WHERE id=@tableID)
    DECLARE @ColIndex       INT=1
    DECLARE @UpdateDetails  NVARCHAR(MAX)=''
    DECLARE @ColName        NVARCHAR(1000)
    DECLARE @ByteIndex      INT

    SELECT * INTO #d FROM deleted
    SELECT * INTO #i FROM inserted

    WHILE (@ColIndex<=@ColCount)
    BEGIN
        --IF (COLUMNS_UPDATED()&POWER(2,@ColIndex-1) <> 0)
        SET @ByteIndex=((@ColIndex-1)/8)+1
        IF (CONVERT(INT,SUBSTRING(COLUMNS_UPDATED(),@ByteIndex,1))&POWER(2,((@ColIndex-1)%8)) <> 0)
        BEGIN
            SET @ColName=(SELECT [name] FROM sys.syscolumns WHERE id=@tableID AND colid=@ColIndex)
            DECLARE @OldValue NVARCHAR(MAX)
            DECLARE @NewValue NVARCHAR(MAX)

            DECLARE @ParmDefinition NVARCHAR(100)=N'@DeletedValue NVARCHAR(MAX) OUTPUT'
            DECLARE @SQL NVARCHAR(1000)='SELECT @DeletedValue=LTRIM(RTRIM(CONVERT(nvarchar(MAX),'+@ColName+'))) FROM #d'
            EXEC sp_executesql @SQL,@ParmDefinition,@DeletedValue=@OldValue OUTPUT

            SET @ParmDefinition = N'@InsertedValue NVARCHAR(MAX) OUTPUT'
            SET @SQL= 'SELECT @InsertedValue=LTRIM(RTRIM(CONVERT(nvarchar(MAX),'+@ColName+'))) FROM #i'
            EXEC sp_executesql @SQL,@ParmDefinition,@InsertedValue=@NewValue OUTPUT
            IF (@OldValue<>@NewValue)
            BEGIN
                SET @UpdateDetails=@UpdateDetails+@ColName+': OLD="'+ @OldValue+'" -New="'+@NewValue+'", '
            END
        END
        SET @ColIndex=@ColIndex+1
    END

    IF (LEN(@UpdateDetails)>0)
    BEGIN   
        SET @UpdateDetails=SUBSTRING(@UpdateDetails,1,LEN(@UpdateDetails)-1)
    END
    ELSE
    BEGIN
        SET @UpdateDetails='No Changes'
    END

    --[User.TransactionLog] is the name of the table that stores the history of changes
    INSERT INTO [User.TransactionLog] 
        ([Tablename],[OperationType],[Desciption],[UserID],[ComputerName],[IP],[ChangeTime])
         SELECT 'MyTable',2,@UpdateDetails,'',@userid,@computername,@ip, @changetime

    DROP TABLE #d
    DROP TABLE #i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...