在某些情况下,如何使用存储过程运行作为值存储在一行中的查询

时间:2019-04-03 10:06:17

标签: sql sql-server stored-procedures

我有一张3栏的桌子。一栏记录了案件编号,一栏记录了针对特定案件的所有DML(插入/更新/删除)查询日期,一栏记录了执行DML的日期和时间。现在,该行可以针对单个案例重复进行,因为它捕获了针对该案例执行的任何DML。

我的要求是,我必须编写一个以“案例号”和/或“日期时间”为输入参数的过程,并且在执行该过程之后,必须将所有DML查询一直到特定日期,然后将其作为普通DML查询执行。

下面是相同的示例表:

enter image description here

对于上述情况1,我想在任何特定日期运行所有dml语句。在这种情况下请提供帮助。

1 个答案:

答案 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)