SQL Server中SELECT查询结果的复杂处理
有一个存储过程,其中包含许多更新(对于许多表)。 我需要做一些类似于记录此更新的事情,但是没有触发器 使用一行+表名并将记录添加到日志表中的SP很容易创建。而且,使用更新的记录也很容易形成选择 我希望找到一种方法来做类似的事情SQL Server中SELECT查询结果的复杂处理,sql,sql-server,select,Sql,Sql Server,Select,有一个存储过程,其中包含许多更新(对于许多表)。 我需要做一些类似于记录此更新的事情,但是没有触发器 使用一行+表名并将记录添加到日志表中的SP很容易创建。而且,使用更新的记录也很容易形成选择 我希望找到一种方法来做类似的事情 MAKE_LOG FROM ( SELECT "tblName", EventID, ID FROM ... ) “MAKE_LOG”-只是一个示例名称。我正在寻找用存储过程处理表的方法。也许,类似于表值参数。最好找到与SQL Server 2005兼容的东西
MAKE_LOG
FROM (
SELECT "tblName", EventID, ID
FROM ...
)
“MAKE_LOG”-只是一个示例名称。我正在寻找用存储过程处理表的方法。也许,类似于表值参数。最好找到与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年起,您可以创建用户定义的表类型,填充它并传递到存储过程:
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
是的,这是更新一行的方法。但如何应用它,若更新是基于大子集的选择(通常是这样的)?看起来,这是一个很好的解决方案!我想在SQLServer2005中没有类似的方法(我是指表值SP)?