【问题标题】:How to generate an automatic INSERT script to a table如何为表生成自动 INSERT 脚本
【发布时间】:2020-03-12 02:38:48
【问题描述】:

我刚开始使用 SQL Server,我不知道是工作、触发器还是过程,总之,我需要您支持我做以下事情:在我的数据库中存储一些需求的记录,这些需求关联到一个状态,可以是Completed或者Closed,一周后(正好是7天)处于Completed状态的需求必须自动改变状态为@987654324 @,但除此之外,我还需要您执行该记录的INSERT(自动),这意味着该行中的所有数据都插入相同,唯一改变的是对应于的列状态,在这种情况下将完成。

以下是我获取状态为Completed的超过7天的需求记录的查询。

SELECT TK_DT_RECORDS.*
FROM TK_HD_TICKETS AS TICKETS
INNER JOIN TK_DT_RECORDS ON TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID
WHERE TK_DT_RECORDS.TK_DT_RECORDS_ID = (SELECT MAX (TK_DT_RECORDS_ID) 
                                        FROM TK_DT_RECORDS 
                                        WHERE TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID)
  AND (TK_DT_RECORDS.TK_CT_STATUS_ID = 'TMN') 
  AND (TK_DT_RECORDS.ACTIVITY_DATE < DATEADD(DAY, 7, GETDATE()));

直到那里我不知道如何在该表中执行自动INSERT

TK_CT_STATUS_ID 对应于Completed 的 TMN 状态标识符,Closed 的 CDO。

更新:

WITH CTE AS 
(
    SELECT TK_DT_RECORDS.*
    FROM TK_HD_TICKETS AS TICKETS
    INNER JOIN TK_DT_RECORDS ON TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID
    WHERE TK_DT_RECORDS.TK_DT_RECORDS_ID = (SELECT MAX (TK_DT_RECORDS_ID) 
                                            FROM TK_DT_RECORDS 
                                            WHERE TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID)
      AND (TK_DT_RECORDS.TK_CT_STATUS_ID = 'TMN') 
      AND (TK_DT_RECORDS.ACTIVITY_DATE < DATEADD(DAY, 7, GETDATE()))
)
INSERT INTO TK_DT_RECORDS ([TK_DT_RECORDS_ID], [ACTIVITY_DATE], [CONTENT],[TK_HD_TICKETS_ID], [NOTE], [USER_UPDATE], [TK_CT_STATUS_ID], [TK_BT_EMPLOYEES_ID],[TK_CT_SERVICES_ID], [TK_CT_PRIORITIES_ID], [TK_CT_CATEGORIES_ID], TK_CT_SUBSERVICES_ID]) 
VALUES ..................;

【问题讨论】:

    标签: sql-server tsql sql-insert procedure database-trigger


    【解决方案1】:

    通过生成返回需要更新的记录的select 查询,您已经完成了工作中最困难的部分。将其转换为 update 语句的一种简单方法是利用 SQL Server 支持的可更新公用表表达式的概念:

    WITH CTE AS (
        SELECT TK_DT_RECORDS.*
        FROM TK_HD_TICKETS AS TICKETS
        INNER JOIN TK_DT_RECORDS ON TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID
        WHERE TK_DT_RECORDS.TK_DT_RECORDS_ID = (SELECT MAX (TK_DT_RECORDS_ID) FROM TK_DT_RECORDS 
        WHERE TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID )
        AND (TK_DT_RECORDS.TK_CT_STATUS_ID = 'TMN') 
        AND (TK_DT_RECORDS.ACTIVITY_DATE < DATEADD(DAY, 7, GETDATE()))
    )
    UPDATE CTE SET TK_CT_STATUS_ID = 'CDO'
    

    编辑

    如果您正在寻找 insert 语句,那么您可以使用 INSERT ... SELECT ... 语法,例如:

    INSERT INTO TK_DT_RECORDS(
        [TK_DT_RECORDS_ID],
        [ACTIVITY_DATE],
        [CONTENT],
        [TK_HD_TICKETS_ID],
        [NOTE],
        [USER_UPDATE],
        [TK_CT_STATUS_ID],
        [TK_BT_EMPLOYEES_ID],
        [TK_CT_SERVICES_ID],
        [TK_CT_PRIORITIES_ID],
        [TK_CT_CATEGORIES_ID],
        [TK_CT_SUBSERVICES_ID]
    )
    SELECT 
        TK_DT_RECORDS.[TK_DT_RECORDS_ID],
        TK_DT_RECORDS.[ACTIVITY_DATE],
        TK_DT_RECORDS.[CONTENT],
        TK_DT_RECORDS.[TK_HD_TICKETS_ID],
        TK_DT_RECORDS.[NOTE],
        TK_DT_RECORDS.[USER_UPDATE],
        'CDO',
        TK_DT_RECORDS.[TK_BT_EMPLOYEES_ID],
        TK_DT_RECORDS.[TK_CT_SERVICES_ID],
        TK_DT_RECORDS.[TK_CT_PRIORITIES_ID],
        TK_DT_RECORDS.[TK_CT_CATEGORIES_ID],
        TK_DT_RECORDS.[TK_CT_SUBSERVICES_ID]
    FROM TK_HD_TICKETS AS TICKETS
    INNER JOIN TK_DT_RECORDS 
        ON TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID
    WHERE 
        TK_DT_RECORDS.TK_DT_RECORDS_ID = (
            SELECT MAX (TK_DT_RECORDS_ID) 
            FROM TK_DT_RECORDS 
            WHERE TICKETS.TK_HD_TICKETS_ID = TK_DT_RECORDS.TK_HD_TICKETS_ID 
        )
        AND (TK_DT_RECORDS.TK_CT_STATUS_ID = 'TMN') 
        AND (TK_DT_RECORDS.ACTIVITY_DATE < DATEADD(DAY, 7, GETDATE()))
    

    请注意,这仅在TK_CT_STATUS_ID 是您表的所有唯一键(包括主键)的一部分时才有效;否则在尝试插入新记录时会出现键约束错误。

    【讨论】:

    • 非常感谢您的回复,但我不想更新注册表,我正在寻找的是插入一个具有相同数据的新的,我只会更改状态,可以完成了吗?
    • @SebastianSalazar:好的,我相应地更新了我的答案。
    • 我不太明白你的更新你可以清楚一点
    • TK_DT_RECORDS中有哪些列?
    • 根据您的回复检查我的更新,插入的值与我在注册表中找到的值相同
    【解决方案2】:

    您不需要 cte。这只是一个更新声明。我稍微更改了您的查询以使用别名。当一切都是大写时,阅读起来非常困难。

    update r
    set TK_CT_STATUS_ID = 'CDO'
    FROM TK_HD_TICKETS AS t
    INNER JOIN TK_DT_RECORDS r ON t.TK_HD_TICKETS_ID = r.TK_HD_TICKETS_ID
    WHERE r.TK_DT_RECORDS_ID = (
                                    SELECT MAX(r2.TK_DT_RECORDS_ID) 
                                    FROM TK_DT_RECORDS r2
                                    WHERE t.TK_HD_TICKETS_ID = r2.TK_HD_TICKETS_ID
                                )
    AND r.TK_CT_STATUS_ID = 'TMN'
    AND r.ACTIVITY_DATE < DATEADD(DAY, 7, GETDATE());
    

    【讨论】:

    • 我不想更新记录,我正在寻找的是插入一个具有相同数据的新记录。
    • 你的问题一点都不清楚。也许你应该问你的老师关于作业的一些澄清。也许重新审视逻辑,因为为相同的信息存储多行数据并不是处理数据的好方法。
    • 但是如果要记录所有执行的动作,例如状态变化
    • 挑战来了。你所要求的并不是那么困难。但是你提供的细节太少了,人们盲目地猜测你想要什么。我们没有任何表格、样本数据或想要的结果。您似乎在描述的是对数据的审计。还有一个计划工作。您需要一份工作来关闭打开的任务或其他任何任务。然后你需要逻辑进入这个工作的内部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2011-07-01
    • 2016-08-21
    • 2018-12-03
    • 2021-04-09
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多