SELECT 查询的复杂处理结果在 SQL 服务器中

Complex processing of SELECT-query results in SQL Server

有一个包含许多更新的存储过程(对于许多 table)。 我需要做一些事情,比如记录这个更新,但是没有触发器

制作SP很容易,取一行+table名字,记录到log-table。而且用更新的记录形成 SELECT 也很容易。

我希望找到方法来做类似

的事情
MAKE_LOG
FROM (
  SELECT "tblName", EventID, ID
  FROM ...
)

"MAKE_LOG" - 只是一个示例名称。我正在寻找使用存储过程处理 table 的方法。也许,像 table 值参数。最好找到与 SQL Server 2005.

兼容的东西

我可以使用游标,但语法看起来不太简洁(可能我应该将其放入函数中)。

也许,还有另一种方法吗?

我不太确定你的提议是什么,但看起来你想包装一堆 SQL 语句并以某种方式神奇地记录更改......这确实很神奇。

相反,按照您在问题中的建议进行操作并创建一个存储过程,您只需将一些参数传递给该存储过程,它就会为您插入一个日志条目。然后在每次更新后调用它。

示例:

CREATE PROCEDURE [dbo].[InsertLogEntry]
    @UserId INT = NULL ,
    @Table NVARCHAR(256) ,
    @EventId INT ,
    @Id INT
AS
    BEGIN
        SET NOCOUNT ON 

        INSERT  INTO LogTable
                ( UserId, [Table], EventId, Id )
        VALUES  ( @UserId, @Table, @EventId, @Id )  
    END

试试这个:

CREATE PROCEDURE spLog
AS
SELECT * FROM #log
GO


DECLARE @t1 TABLE(ID INT IDENTITY(1, 1), Name NVARCHAR(MAX))
DECLARE @t2 TABLE(ID INT IDENTITY(1, 1), Name NVARCHAR(MAX))
create TABLE #log (ID INT, TableName NVARCHAR(MAX), Act NVARCHAR(MAX))

INSERT INTO @t1 
OUTPUT Inserted.ID, '@t1', 'INSERT' INTO #log
VALUES('Table1 Value1')

INSERT INTO @t2 
OUTPUT Inserted.ID, '@t2', 'INSERT' INTO #log
VALUES('Table2 Value1')

INSERT INTO @t1 
OUTPUT Inserted.ID, '@t1', 'INSERT' INTO #log
VALUES('Table1 Value2')

UPDATE @t2
SET Name = 'New Name'
OUTPUT Inserted.ID, '@t2', 'UPDATE' INTO #log

DELETE 
FROM @t1
OUTPUT deleted.ID, '@t1', 'DELETE' INTO #log

EXEC dbo.spLog

DROP TABLE #log

输出:

ID  TableName   Act
1   @t1         INSERT
1   @t2         INSERT
2   @t1         INSERT
1   @t2         UPDATE
1   @t1         DELETE
2   @t1         DELETE

从 2008 年开始,您可以创建用户定义的 table 类型,填充它并传递给存储过程:

CREATE TYPE LogTableType AS TABLE
(
    ID INT, 
    TableName NVARCHAR(MAX), Act NVARCHAR(MAX)
)
GO

CREATE PROCEDURE spLog
@Log LogTableType READONLY
AS
SELECT * FROM @Log
GO


DECLARE @t1 TABLE(ID INT IDENTITY(1, 1), Name NVARCHAR(MAX))
DECLARE @t2 TABLE(ID INT IDENTITY(1, 1), Name NVARCHAR(MAX))
DECLARE @log LogTableType

INSERT INTO @t1 
OUTPUT Inserted.ID, '@t1', 'INSERT' INTO @log
VALUES('Table1 Value1')

INSERT INTO @t2 
OUTPUT Inserted.ID, '@t2', 'INSERT' INTO @log
VALUES('Table2 Value1')

INSERT INTO @t1 
OUTPUT Inserted.ID, '@t1', 'INSERT' INTO @log
VALUES('Table1 Value2')

UPDATE @t2
SET Name = 'New Name'
OUTPUT Inserted.ID, '@t2', 'UPDATE' INTO @log


DELETE 
FROM @t1
OUTPUT deleted.ID, '@t2', 'DELETE' INTO @log

EXEC dbo.spLog @log