我的SQL Server 2008数据库中有一个审计表,其中包含我正在审计的数据的XML。
但是,在这个XML中,我需要审计表中审计记录的ID。
问题是ID是标识列。
所以这是一个问题22,在我知道ID之前我无法插入XML,在插入XML之前我无法找到ID。
我需要ID字段作为标识列,我需要XML中的ID。
我该怎么做?
修改:
从SQL Locking的角度来看,我知道这应该不起作用,但它工作正常:
INSERT INTO Audit (
[Data]
,[CreatedUser]
,[CreatedDateTime]
,[LastModifiedUser]
,[LastModifiedDateTime]
) VALUES (
@Data
,@CreatedUser
,@CurrentDateTime
,@CreatedUser
,@CurrentDateTime
);
SELECT @NewAudit_ID = SCOPE_IDENTITY()
SELECT @Data = Data
FROM Audit WITH (NOLOCK)
WHERE Audit_ID = @NewAudit_ID
SET @Data.modify('
replace value of (/Search[1]/@Id[1]) with sql:variable("@NewAudit_ID")')
UPDATE Audit
SET Data = @Data
WHERE hAudit_ID = @NewAudit_ID
为什么会这样?我应该用吗?
答案 0 :(得分:2)
您在审核时收到XML。在呈现数据时,您可以制作包含原始XML和标识的XML:
SELECT Id AS [Id]
, OriginalXml AS [*]
FROM AuditTable
FOR XML PATH('...'), TYPE;
答案 1 :(得分:1)
一种方法是通过存储过程插入空白记录。存储过程将具有一个输出参数,您可以使用新插入的行的标识填充该参数。在插入XML数据后,您的应用可以读取标识值。然后,更新存储过程可以将标识和XML数据作为参数来更新新插入的行。缺点是这需要插入和更新。
CREATE PROCEDURE [dbo].[cp_InsertForID]
(
@IDOUT INT = NULL OUTPUT
)
AS
INSERT INTO AUDITABLE VALUES ('')
SET @IDOUT = (SELECT SCOPE_IDENTITY())