我有一张3栏的桌子。一栏记录了案件编号,一栏记录了针对特定案件的所有DML(插入/更新/删除)查询日期,一栏记录了执行DML的日期和时间。现在,该行可以针对单个案例重复进行,因为它捕获了针对该案例执行的任何DML。
我的要求是,我必须编写一个以“案例号”和/或“日期时间”为输入参数的过程,并且在执行该过程之后,必须将所有DML查询一直到特定日期,然后将其作为普通DML查询执行。
下面是相同的示例表:
对于上述情况1,我想在任何特定日期运行所有dml语句。在这种情况下请提供帮助。
答案 0 :(得分:1)
给出以下架构和记录:
create table caseLog
(
CaseID INT,
Query NVARCHAR(MAX),
[Date] DATETIME
);
CREATE TABLE Cases
(ID INT, Name NVARCHAR(50))
INSERT INTO caseLog (CaseID, Query, [Date])
VALUES
(1, 'INSERT INTO Cases (ID, Name) VALUES (1, ''First Name'')', '2019-04-02 15:00'),
(1, 'UPDATE Cases SET Name = ''Second Name'' WHERE ID = 1', '2019-04-02 16:00'),
(1, 'UPDATE Cases SET Name = ''Third Name'' WHERE ID = 1', '2019-04-02 17:00');
该过程可能类似于:
CREATE PROCEDURE executeCaseLog
@CaseID INT,
@Until DATETIME
AS
DECLARE
@Query NVARCHAR(MAX) = '';
BEGIN
SELECT @Query += CONCAT(caseLog.Query, ';', CHAR(13), CHAR(10))
FROM caseLog
WHERE caseID = @CaseID
AND [Date] <= @Until
-- For showcase purposes
PRINT @Query
EXEC sp_executesql @Query
END;
GO
现在,如果像这样执行:
EXEC executeCaseLog @CaseID = 1, @Until = '2019-04-02 16:30'
它将产生以下内容:
SELECT * FROM Cases
ID Name
----------- --------------------------------------------------
1 Second Name
(1 row affected)