使用SQL Server触发器更改文本格式

时间:2015-11-16 16:49:21

标签: sql sql-server

我要做的是当新数据输入数据库时​​,运行一个触发器将所有文本转换为TitleCase。我以前这样做是为了创建一个函数,然后使用onearr=($(tr , ' ' <<<"$one")) 来调用该函数,但这是非常耗费人力的。

我以前的SQL函数:

UPDATE TABLE

如何调用该函数:

CREATE FUNCTION [dbo].[InitCap]
     (@InputString varchar(4000)) 
RETURNS VARCHAR(4000)
AS
BEGIN
    DECLARE @Index          INT
    DECLARE @Char           CHAR(1)
    DECLARE @PrevChar       CHAR(1)
    DECLARE @OutputString   VARCHAR(255)

    SET @OutputString = LOWER(@InputString)
    SET @Index = 1

    WHILE @Index <= LEN(@InputString)
    BEGIN
        SET @Char     = SUBSTRING(@InputString, @Index, 1)
        SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                             ELSE SUBSTRING(@InputString, @Index - 1, 1)
                        END

        IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(')
        BEGIN
            IF @PrevChar != '''' OR UPPER(@Char) != 'S'
               SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char))
        END

        SET @Index = @Index + 1
    END

    RETURN @OutputString
END

新触发器:

update dbo.table
set colName = [dbo].[InitCap](colName);

这是正确的方法吗?我可以用什么代替CREATE TRIGGER [dbo].[TableInsert] ON [Table] AFTER INSERT AS BEGIN DECLARE @InputString varchar(4000) DECLARE @Index INT DECLARE @Char CHAR(1) DECLARE @PrevChar CHAR(1) DECLARE @OutputString VARCHAR(255) SET @OutputString = LOWER(@InputString) SET @Index = 1 WHILE @Index <= LEN(@InputString) BEGIN SET @Char = SUBSTRING(@InputString, @Index, 1) SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' ELSE SUBSTRING(@InputString, @Index - 1, 1) END IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') BEGIN IF @PrevChar != '''' OR UPPER(@Char) != 'S' SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) END SET @Index = @Index + 1 END RETURN @OutputString END

由于

3 个答案:

答案 0 :(得分:1)

我实际上建议保留你的InitCap功能,因为将这些逻辑隐藏起来以便重复使用是件好事。在不止一个地方拥有这种逻辑是没有意义的。考虑到这一点,除了更新插入的值之外,你的触发器确实没有做太多的事情:

CREATE TRIGGER [dbo].[TableInsert]
ON [Table] 
AFTER INSERT
AS
BEGIN
    UPDATE 
        t
    SET 
        t.colName = dbo.InitCap(i.colName)
    FROM 
        dbo.table t
    INNER JOIN 
        inserted i
        ON
        i.primaryKeyColumn = t.primaryKeyColumn
END

答案 1 :(得分:0)

我不确定MS特有的语法是什么,但是BEFORE INSERT FOR EACH ROW触发器允许您访问名为NEW的记录中的新数据,并允许您操作记录的内容(例如,更改)实际执行INSERT之前的值的情况。

答案 2 :(得分:0)

您可以尝试这样的事情:

CREATE TRIGGER [dbo].[TableInsert]
ON [Table] 
AFTER INSERT
AS
UPDATE tbl
SET tbl.colName=[dbo].[InitCap](ins.colName)
FROM [table] tbl INNER JOIN inserted ins ON ....--your keys;