我要做的是当新数据输入数据库时,运行一个触发器将所有文本转换为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
?
由于
答案 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;