Click here to Skip to main content
15,896,118 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
I created a trigger as below to check whether the UDF are available or not if are then DROP them and create new UDF, then at last Use them on a table named TableToClean.
But it's not working

USE [DB2]
GO
/****** Object:  Trigger [dbo].[cleanData]    Script Date: 7/22/2014 3:33:19 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[cleanData]
ON [dbo].[TableToClean] FOR INSERT
AS
BEGIN
            SET NOCOUNT ON
            IF OBJECT_ID('[dbo].[cleanStyleData]') IS NOT NULL
             DROP FUNCTION cleanStyleData
            GO

        CREATE FUNCTION [dbo].[cleanStyleData] ( @StyleText VARCHAR(MAX) )
        RETURNS VARCHAR(MAX)
        AS BEGIN
            DECLARE @Start INT
            DECLARE @End INT
            DECLARE @Length INT
            SET @Start = CHARINDEX('<style>', @StyleText)
            SET @End = CHARINDEX('</style>', @StyleText, @Start)
            SET @Length = ( @End - @Start ) + 1
            WHILE @Start > 0 AND @End > 0 AND @Length > 0
                BEGIN
                    SET @StyleText = STUFF(@StyleText, @Start, @Length, '')
                    SET @Start = CHARINDEX('<style>', @StyleText)
                    SET @End = CHARINDEX('</style>', @StyleText, @Start)
                    SET @Length = ( @End - @Start ) + 1
                END
            RETURN REPLACE(REPLACE( REPLACE(REPLACE(LTRIM(RTRIM(@StyleText)), '$', ''), '£', ''), '€', ''), '↵', '')
        END

        IF OBJECT_ID('[dbo].[cleanScriptData]') IS NOT NULL
         DROP FUNCTION cleanScriptData
        GO

        CREATE FUNCTION [dbo].[cleanScriptData] ( @ScriptText VARCHAR(MAX) )
        RETURNS VARCHAR(MAX)
        AS BEGIN
            DECLARE @Start INT
            DECLARE @End INT
            DECLARE @Length INT
            SET @Start = CHARINDEX('<script>', @ScriptText)
            SET @End = CHARINDEX('</script>', @ScriptText, @Start)
            SET @Length = ( @End - @Start ) + 1
            WHILE @Start > 0 AND @End > 0 AND @Length > 0
                BEGIN
                    SET @ScriptText = STUFF(@ScriptText, @Start, @Length, '')
                    SET @Start = CHARINDEX('<script>', @ScriptText)
                    SET @End = CHARINDEX('</script>', @ScriptText, @Start)
                    SET @Length = ( @End - @Start ) + 1
                END
            RETURN REPLACE(REPLACE( REPLACE(LTRIM(RTRIM(@ScriptText)), '=', ''), '\', ''), '||', '')
        END

        UPDATE [DB2].[dbo].[TableToClean]
        SET [DA_ArticleDetails] = [dbo].[cleanStyleData] ([DA_ArticleDetails])

        UPDATE [DB2].[dbo].[TableToClean]
        SET [DA_ArticleDetails] = [dbo].[cleanScriptData] ([DA_ArticleDetails])

END


I tried to execute it but giving errors.
Posted
Comments
Corporal Agarn 22-Jul-14 9:58am    
Ever think of creating a function that works in the first place? You should not have to re-build it every time the data changes. Or possible have a few functions to handle different data.
GoneBump 22-Jul-14 10:16am    
Actually the requirement is to break the cleaning in steps. Creating a single UDF will make a overload as the loop will have to do it at a time. Breaking it provides a clear picture for improvisation.
Mayank Vashishtha 23-Jul-14 5:13am    
Your approach is wrong GoneBump. You cannot create a function inside a trigger which is also a kind of stored procedure in sql server. It is never going to get compiled buddy. I agree with Corporal Agarn of having a function already created. Moreover you can try using dynamic sql query instead.
GoneBump 23-Jul-14 5:50am    
Thanks!!!
But how to call thoes UDF inside this trigger?
Will this work if the UDF are created before the trigger run?

UPDATE [DB2].[dbo].[TableToClean]
SET [DA_ArticleDetails] = [dbo].[cleanStyleData] ([DA_ArticleDetails])
Mayank Vashishtha 23-Jul-14 6:08am    
Have you checked my solution?

1 solution

It will work. If you find this as a solution Give it a rating. :-)

USE [DB2]
GO
/****** Object: Trigger [dbo].[cleanData] Script Date: 7/22/2014 3:33:19 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[cleanData]
ON [dbo].[TableToClean] FOR INSERT
AS
BEGIN

SET NOCOUNT ON
IF OBJECT_ID('[dbo].[cleanStyleData]') IS NOT NULL
DROP FUNCTION cleanStyleData

DECLARE @Query1 NVARCHAR(MAX), @Query2 NVARCHAR(MAX)

SET @Query1 = 'CREATE FUNCTION [dbo].[cleanStyleData] ( @StyleText VARCHAR(MAX) )
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX(''<style>'', @StyleText)
SET @End = CHARINDEX(''</style>'', @StyleText, @Start)
SET @Length = ( @End - @Start ) + 1
WHILE @Start > 0 AND @End > 0 AND @Length > 0
BEGIN
SET @StyleText = STUFF(@StyleText, @Start, @Length, '''')
SET @Start = CHARINDEX(''<style>'', @StyleText)
SET @End = CHARINDEX(''</style>'', @StyleText, @Start)
SET @Length = ( @End - @Start ) + 1
END
RETURN REPLACE(REPLACE( REPLACE(REPLACE(LTRIM(RTRIM(@StyleText)), ''$'', ''''), ''£'', ''''), ''€'', ''''), ''↵'', '''')
END'

EXECUTE sp_executesql @Query1


IF OBJECT_ID('[dbo].[cleanScriptData]') IS NOT NULL
DROP FUNCTION cleanScriptData

SET @Query2 = 'CREATE FUNCTION [dbo].[cleanScriptData] ( @ScriptText VARCHAR(MAX) )
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @Start INT
DECLARE @End INT
DECLARE @Length INT
SET @Start = CHARINDEX(''<script>'', @ScriptText)
SET @End = CHARINDEX(''</script>'', @ScriptText, @Start)
SET @Length = ( @End - @Start ) + 1
WHILE @Start > 0 AND @End > 0 AND @Length > 0
BEGIN
SET @ScriptText = STUFF(@ScriptText, @Start, @Length, '''')
SET @Start = CHARINDEX(''<script>'', @ScriptText)
SET @End = CHARINDEX(''</script>'', @ScriptText, @Start)
SET @Length = ( @End - @Start ) + 1
END
RETURN REPLACE(REPLACE( REPLACE(LTRIM(RTRIM(@ScriptText)), ''='', ''''), ''\'', ''''), ''||'', '''')
END'

EXECUTE sp_executesql @Query2

UPDATE [DB2].[dbo].[TableToClean]
SET [DA_ArticleDetails] = [dbo].[cleanStyleData] ([DA_ArticleDetails])

UPDATE [DB2].[dbo].[TableToClean]
SET [DA_ArticleDetails] = [dbo].[cleanScriptData] ([DA_ArticleDetails])
END
 
Share this answer
 
v2
Comments
GoneBump 18-Oct-14 3:13am    
Thanks a LOT Mayank.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900