存储过程从表中获取部分记录名称?

时间:2016-02-03 22:35:45

标签: sql sql-server stored-procedures informix

想象一下,我有一个名为“ TableA ”的表格,此表格中包含“IDtable”,“Tabname”和“后缀”列。

IDtable和Tabname被正确填充,但后缀的所有记录都为空。

我必须开发一个允许填充后缀列的存储过程。为此,我知道我必须在tabname中过滤记录的名称。

示例:

Tabname: a_type_price 后缀:价格

Tabname: a_d_ser_sales 后缀:销售

我认为我必须开发一个 for cycle ,它会在Tabname的名称中查找“_”并过滤掉最后一个“_”之后的所有内容。

任何人都知道执行此存储过程的最佳方法吗?

2 个答案:

答案 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,因为我们不希望' '输出。

请注意,RIGHTCHARINDEXREVERSEINSTR功能仅可从 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轻松获取它。甚至以编程方式也很容易处理它。