Home Forums SQL Server 7,2000 T-SQL Need help to write a stored procedure / Dynamic SQL!! RE: Need help to write a stored procedure / Dynamic SQL!!

  • Thanks for the help steve and Barry !!!

    well my task was to script the SQl for triggers in the same format what I written for a table initially . so I used cursors to do this and I did accomplished it

    and here is the code

    DECLARE Table_Trigger CURSOR

    FOR

    SELECT name TableName FROM sys.tables

    DECLARE @table_name SYSNAME

    DECLARE @Primary_key SYSNAME

    DECLARE @Trigger VARCHAR(MAX)

    -- Loop through All tables

    OPEN Table_Trigger

    FETCH NEXT FROM Table_Trigger INTO @table_name

    WHILE (@@FETCH_STATUS = 0)

    BEGIN

    SET NOCOUNT ON

    SELECT @Primary_key = COL_NAME(ic.OBJECT_ID,ic.column_id)

    FROM sys.indexes AS i

    INNER JOIN sys.index_columns AS ic ON i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id

    WHERE i.is_primary_key = 1 and i.object_id = Object_id(@table_name)

    SET @Trigger = '-------------------'+@table_name+'

    Create TRIGGER [TR_UD_'+@table_name+'] ON '+@table_name+

    '

    INSTEAD OF DELETE, UPDATE

    AS

    DECLARE @ErrorMessage VARCHAR(4000)

    DECLARE @ErrorSeverity INT

    DECLARE @ErrorState INT

    BEGIN TRY

    INSERT INTO z_'+@table_name+'

    ([ActionDML],'

    -- Loop through All Columns for a table

    DECLARE Table_Column_Tri CURSOR

    FOR

    SELECT column_name

    FROM INFORMATION_SCHEMA.COLUMNS

    WHERE TABLE_NAME = @table_name

    DECLARE @column_name SYSNAME

    DECLARE @Delete VARCHAR(MAX)

    DECLARE @select VARCHAR(MAX)

    DECLARE @Insert VARCHAR(MAX)

    DECLARE @Pos int SET @Pos = 1

    OPEN Table_Column_Tri

    FETCH NEXT FROM Table_Column_Tri INTO @column_name

    WHILE (@@FETCH_STATUS = 0)

    BEGIN

    IF (@select IS NULL And @Pos = 1)

    SET @select = QUOTENAME(@column_name)

    ELSE

    SET @select = @select + ' , ' +QUOTENAME(@column_name)

    IF (@Delete IS NULL)

    SET @Delete = 'Deleted.'+ QUOTENAME(@column_name)

    ELSE

    SET @Delete = @Delete + ' , ' + 'Deleted.'+ QUOTENAME(@column_name)

    IF (@Insert IS NULL AND @column_name <> @Primary_key)

    SET @insert = + QUOTENAME(@column_name)+ ' = inserted.'+QUOTENAME(@column_name)

    ELSE

    SET @insert = @insert + ' , ' + QUOTENAME(@column_name)+ ' = inserted.'+QUOTENAME(@column_name)

    FETCH NEXT FROM Table_Column_Tri INTO @column_name

    END

    CLOSE Table_Column_Tri

    DEALLOCATE Table_Column_Tri

    SET @TRIGGER = @TRIGGER +@select+')

    SELECT CASE WHEN deleted.'

    +@Primary_key+' IS NOT NULL AND inserted.'+@Primary_key+' IS NOT NULL

    THEN CASE WHEN deleted.ROWVERSION = -1 THEN '+''''+'M'+''''+'

    WHEN deleted.ROWVERSION = 0 THEN '+''''+'I'+''''+'

    ELSE '+''''+'U'+''''+'

    END

    WHEN deleted.'+@Primary_key+' IS NOT NULL AND inserted.'+@Primary_key+' IS NULL

    THEN '+''''+'D'+''''+'

    END as ActionDML,

    '+@Delete+'

    FROM deleted

    LEFT JOIN '+@table_name+' on '+@table_name+'.'+@Primary_key+' = deleted.'+@Primary_key+'

    LEFT JOIN inserted on '+@table_name+'.'+@Primary_key+' = inserted.'+@Primary_key+'

    BEGIN

    IF (SELECT COUNT(*) FROM inserted) = 0

    Delete '+@table_name+' where '+@Primary_key+' in (select '+@Primary_key+' from deleted)

    ELSE

    UPDATE '+@table_name+' set '+@Insert+'

    FROM '+@table_name+', inserted

    WHERE '+@table_name+'.'+@Primary_key+' = inserted.'+@Primary_key+'

    END

    END TRY

    BEGIN CATCH

    SELECT @ErrorMessage = '+''''+'TR_UD_'+@table_name+':'+''''+'+ ERROR_MESSAGE(),

    @ErrorSeverity = ERROR_SEVERITY(),

    @ErrorState = ERROR_STATE();

    IF @@TRANCOUNT > 0

    BEGIN

    RAISERROR (@ErrorMessage, 16,1) with nowait

    ROLLBACK TRAN

    RETURN

    END

    END CATCH'

    ---Print Trigger

    SET @Delete = Null

    SET @select = Null

    SET @Insert = Null

    PRINT @TRIGGER

    PRINT ''

    FETCH NEXT FROM Table_Trigger INTO @table_name

    END

    CLOSE Table_Trigger

    DEALLOCATE Table_Trigger