如何在SQL Server表中的XML数据中插入标识ID列?

时间:2009-12-02 23:34:06

标签: sql-server xml identity

我的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  

为什么会这样?我应该用吗?

2 个答案:

答案 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())