如何生成自动 INSERT 脚本到 table
How to generate an automatic INSERT script to a table
我刚刚开始使用SQL服务器,我不知道它是工作,触发器还是过程,总之,我需要你能支持我的是做以下事情: 在我存储一些需求记录的数据库中,这些需求与它们可以是 Completed
或 Closed
的状态相关联,一周后处于 Completed
状态的需求(恰好 7 天)必须自动将状态更改为 Closed
,但除此之外,我还需要您对已创建的记录执行 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
执行到那个 table。
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 ..................;
通过生成一个 returns 需要更新记录的 select
查询,您已经完成了工作中最困难的部分。将其转换为 update
语句的一种简单方法是利用 updatable 通用 table 表达式的概念,SQL 服务器支持:
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
是您 table 的所有唯一键(包括主键)的一部分时,这才有效;否则在尝试插入新记录时会出现键约束错误。
你不需要 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());
我刚刚开始使用SQL服务器,我不知道它是工作,触发器还是过程,总之,我需要你能支持我的是做以下事情: 在我存储一些需求记录的数据库中,这些需求与它们可以是 Completed
或 Closed
的状态相关联,一周后处于 Completed
状态的需求(恰好 7 天)必须自动将状态更改为 Closed
,但除此之外,我还需要您对已创建的记录执行 INSERT
(自动),这意味着该行中的所有数据插入相同,唯一改变的是对应于状态的列,在这种情况下将完成。
以下是我获取状态Completed
.
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
执行到那个 table。
TK_CT_STATUS_ID
对应 Completed
的 TMN 状态标识符,Closed
.
更新:
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 ..................;
通过生成一个 returns 需要更新记录的 select
查询,您已经完成了工作中最困难的部分。将其转换为 update
语句的一种简单方法是利用 updatable 通用 table 表达式的概念,SQL 服务器支持:
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
是您 table 的所有唯一键(包括主键)的一部分时,这才有效;否则在尝试插入新记录时会出现键约束错误。
你不需要 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());