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
有一个包含许多更新的存储过程(对于许多 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