想象一下,我有一个名为“ TableA ”的表格,此表格中包含“IDtable”,“Tabname”和“后缀”列。
IDtable和Tabname被正确填充,但后缀的所有记录都为空。
我必须开发一个允许填充后缀列的存储过程。为此,我知道我必须在tabname中过滤记录的名称。
示例:
Tabname: a_type_price 后缀:价格
Tabname: a_d_ser_sales 后缀:销售
我认为我必须开发一个 for cycle ,它会在Tabname的名称中查找“_”并过滤掉最后一个“_”之后的所有内容。
任何人都知道执行此存储过程的最佳方法吗?
答案 0 :(得分:1)
你会想要更新表 - 你甚至不需要存储过程,除非这是你作为工作或频繁运行的东西。
你可以这样做:
CREATE PROCEDURE usp_Upd_TableASuffix()
AS
BEGIN
SET NOCOUNT ON
UPDATE TableA SET Suffix = RIGHT(Tabname, CHARINDEX('_', REVERSE(Tabname)) - 1)
END
快速解释:您想要在最后一个RIGHT
字符后面的字符串的_
部分 - 获取最后一个字符串,在CHARINDEX
上使用REVERSE
字符串。
您不能使用默认约束执行此操作,因为您必须引用其他列,但您可以使用触发器,假设IDtable
是您的主键:
CREATE TRIGGER trg_TableA_Suffix
ON TableA
AFTER INSERT, UPDATE
AS
UPDATE TableA SET Suffix = RIGHT(i.Tabname, CHARINDEX('_',REVERSE(i.Tabname))-1)
FROM inserted i
WHERE TableA.IDTable = i.IDTable
GO
请注意,如果IDTable
不唯一,或者您的表格完全缺少主键,则无效。
最后一个选项 - 如果您真的希望Suffix
只包含Tabname
的最后一部分并且永远不想更改它,那么这可能是最好的 - 您可以Suffix
计算列。
ALTER TABLE TableA DROP COLUMN Suffix
ALTER TABLE TableA ADD Suffix AS RIGHT(Tabname, CHARINDEX('_',REVERSE(Tabname))-1) PERSISTED
答案 1 :(得分:1)
informix 。
正如@ dan-field所说,并解释,你可以使用:
进行更新UPDATE tablea
SET suffix = RIGHT(tabname, CHARINDEX('_', REVERSE(tabname)) - 1);
另一种方式是:
UPDATE tablea
SET suffix = SUBSTR(tabname, INSTR(tabname, '_', -1)+1);
INSTR会在' '的右边(-1)为您提供第一次出现的索引。 SUBSTR将从您传递的索引开始为您提供子字符串,在这种情况下,我们添加1,因为我们不希望' '输出。
请注意,RIGHT,CHARINDEX,REVERSE和INSTR功能仅可从 11.70 开始使用。
在 11.50 上,您可以尝试这个丑陋的解决方案:
CREATE PROCEDURE test()
DEFINE i_IDtable LIKE tablea.IDtable;
DEFINE c_suffix LIKE tablea.tabname;
DEFINE i INT;
FOREACH cur1 WITH HOLD FOR
SELECT IDtable ,Tabname
INTO i_IDtable, c_suffix
FROM tablea
LET i = LENGTH(c_suffix);
WHILE i > 0
IF SUBSTR(c_suffix,i) LIKE '\_%' THEN
LET c_suffix = SUBSTR(c_suffix,i+1);
EXIT WHILE;
ELSE
LET i = i -1;
END IF
END WHILE;
UPDATE tablea
SET suffix = c_suffix,
WHERE idtable = i_IDtable;
END FOREACH;
END PROCEDURE;
但是如果后缀始终是tabname
的这一部分,那么它不是存储在桌面上的好习惯。
您可以从已存储的tabname
轻松获取它。甚至以编程方式也很容易处理它。