Sql server 创建触发器以在其中运行标量值函数以进行插入

Sql server 创建触发器以在其中运行标量值函数以进行插入,sql-server,database,triggers,sql-function,Sql Server,Database,Triggers,Sql Function,我创建了一个触发器,如下所示,用于检查UDF是否可用,然后删除它们并创建新的UDF,最后在名为“TableToClean”的表上使用它们。 但它不起作用- 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].[c

我创建了一个触发器,如下所示,用于检查UDF是否可用,然后删除它们并创建新的UDF,最后在名为“TableToClean”的表上使用它们。
但它不起作用-

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)), '$', ''), '£', ''), '€', ''), '&#8629;', '')
        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
使用[DB2]
去
/******对象:触发器[dbo]。[cleanData]脚本日期:2014年7月22日下午3:33:19******/
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
ALTER触发器[dbo].[cleanData]
在[dbo].[TableToClean]上进行插入
作为
开始
不计较
如果对象_ID('[dbo].[cleanStyleData]')不为空
删除函数cleanStyleData
去
创建函数[dbo]。[cleanStyleData](@StyleText-VARCHAR(MAX))
返回VARCHAR(最大值)
作为开始
声明@Start INT
声明@End INT
声明@Length INT
设置@Start=CHARINDEX(“”,@StyleText)
设置@End=CHARINDEX(“”,@StyleText,@Start)
设置@Length=(@End-@Start)+1
而@Start>0和@End>0和@Length>0
开始
设置@StyleText=STUFF(@StyleText、@Start、@Length、)
设置@Start=CHARINDEX(“”,@StyleText)
设置@End=CHARINDEX(“”,@StyleText,@Start)
设置@Length=(@End-@Start)+1
结束
返回替换(替换(替换(替换(LTRIM(RTRIM(@StyleText))),“$”,“,”,“;”,”,“€,”,“,”,”,“↵;”,”)
结束
如果对象_ID('[dbo].[cleanScriptData]')不为空
删除函数cleanScriptData
去
创建函数[dbo]。[cleanScriptData](@ScriptText-VARCHAR(MAX))
返回VARCHAR(最大值)
作为开始
声明@Start INT
声明@End INT
声明@Length INT
设置@Start=CHARINDEX(“”,@ScriptText)
设置@End=CHARINDEX(“”,@ScriptText,@Start)
设置@Length=(@End-@Start)+1
而@Start>0和@End>0和@Length>0
开始
设置@ScriptText=STUFF(@ScriptText、@Start、@Length、)
设置@Start=CHARINDEX(“”,@ScriptText)
设置@End=CHARINDEX(“”,@ScriptText,@Start)
设置@Length=(@End-@Start)+1
结束
返回REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(@ScriptText)),'=','','\','','','| |','')
结束
更新[DB2].[dbo].[TableToClean]
设置[DA_ArticleDetails]=[dbo]。[cleanStyleData]([DA_ArticleDetails])
更新[DB2].[dbo].[TableToClean]
设置[DA_ArticleDetails]=[dbo]。[cleanScriptData]([DA_ArticleDetails])
结束
我试图执行它,但出现了错误。

您必须使用
Exec()
命令

试试这个:

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 @Command NVARCHAR(MAX)
    SET @Command = '
        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)), ''$'', ''''), ''£'', ''''), ''€'', ''''), ''&#8629;'', '''')
        END'
        EXEC(@Command)

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

        DECLARE @command = '
        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'
        EXEC(@Command)

        SET @Command = '
        UPDATE [DB2].[dbo].[TableToClean]
        SET [DA_ArticleDetails] = [dbo].[cleanStyleData] ([DA_ArticleDetails])'
        EXEC(@Command)

        SET @Command = '
        UPDATE [DB2].[dbo].[TableToClean]
        SET [DA_ArticleDetails] = [dbo].[cleanScriptData] ([DA_ArticleDetails])'
        EXEC(@Command)
END
ALTER触发器[dbo].[cleanData]
在[dbo].[TableToClean]上进行插入
作为
开始
不计较
如果对象_ID('[dbo].[cleanStyleData]')不为空
删除函数cleanStyleData
声明@Command NVARCHAR(最大值)
SET@Command='1〕
创建函数[dbo]。[cleanStyleData](@StyleText-VARCHAR(MAX))
返回VARCHAR(最大值)
作为开始
声明@Start INT
声明@End INT
声明@Length INT
设置@Start=CHARINDEX(“”,@StyleText)
设置@End=CHARINDEX(“”,@StyleText,@Start)
设置@Length=(@End-@Start)+1
而@Start>0和@End>0和@Length>0
开始
设置@StyleText=STUFF(@StyleText、@Start、@Length、)
设置@Start=CHARINDEX(“”,@StyleText)
设置@End=CHARINDEX(“”,@StyleText,@Start)
设置@Length=(@End-@Start)+1
结束
返回替换(替换(替换(替换(LTRIM(RTRIM(@StyleText)))、“”$“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”、“”↵;“”、“”、“”)
结束'
EXEC(@Command)
如果对象_ID('[dbo].[cleanScriptData]')不为空
删除函数cleanScriptData
声明@command='1!'
创建函数[dbo]。[cleanScriptData](@ScriptText-VARCHAR(MAX))
返回VARCHAR(最大值)
作为开始
声明@Start INT
声明@End INT
声明@Length INT
设置@Start=CHARINDEX(“”,@ScriptText)
设置@End=CHARINDEX(“”,@ScriptText,@Start)
设置@Length=(@End-@Start)+1
而@Start>0和@End>0和@Length>0
开始
设置@ScriptText=STUFF(@ScriptText、@Start、@Length、)
设置@Start=CHARINDEX(“”,@ScriptText)
设置@End=CHARINDEX(“”,@ScriptText,@Start)
设置@Length=(@End-@Start)+1
结束
返回替换(替换(替换(LTRIM(RTRIM(@ScriptText)),“”=“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”)
结束'
EXEC(@Command)
SET@Command='1〕
更新[DB2].[dbo].[TableToClean]
设置[DA_ArticleDetails]=[dbo].[cleanStyleData]([DA_ArticleDetails])'
EXEC(@Command)
SET@Command='1〕
更新[DB2].[dbo].[TableToClean]
设置[DA_ArticleDetails]=[dbo].[cleanScriptData]([DA_ArticleDetails])'
EXEC(@Command)
结束

到底为什么这些函数必须通过触发器重建?另外,我正要插入
嗨,因为我们的开发人员正在不断更新函数,所以新的UDF应该被使用,旧的应该被删除,否则我将使用alter function。Damien_不信者,兄弟所有的标签也将被删除在其他功能,我没有在代码中列出。你能帮个忙吗?用这种方法你手上有一个性能定时炸弹。标量函数是出了名的慢。用扳机打电话更糟糕。然后再加上一个非常奇怪的概念,即删除函数并重新创建它们