Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server中SELECT查询结果的复杂处理_Sql_Sql Server_Select - Fatal编程技术网

SQL Server中SELECT查询结果的复杂处理

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兼容的东西

有一个存储过程,其中包含许多更新(对于许多表)。 我需要做一些类似于记录此更新的事情,但是没有触发器

使用一行+表名并将记录添加到日志表中的SP很容易创建。而且,使用更新的记录也很容易形成选择

我希望找到一种方法来做类似的事情

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)?