2009-12-02 32 views
0

我在我的SQL Server 2008數據庫中有一個審計表,其中包含我正在審計的數據的XML。如何將XML數據中的標識ID列插入到SQL Server表中?

但是,在這個XML中,我需要審計表中審計記錄的ID。

問題在於ID是標識列。

因此,它是一種捕獲22,直到我知道ID,我才能插入XML,直到插入XML才找到ID。

我需要ID字段是一個標識列,我需要在XML中的ID。

我該怎麼做?

編輯

從SQL鎖定的角度看,我知道這不應該工作,但它工作正常:

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 

爲什麼將這項工作?我應該使用它嗎?

回答

1

一種方式是通過存儲過程來插入一個空白記錄。存儲過程將有一個輸出參數,您將使用新插入的行的標識來填充該參數。插入XML數據後,您的應用程序可以讀取標識值。然後更新存儲過程可以將標識和XML數據作爲參數來更新新插入的行。缺點是這需要插入和更新。

CREATE PROCEDURE [dbo].[cp_InsertForID]  
( 
@IDOUT INT = NULL OUTPUT 
)  
AS 
INSERT INTO AUDITABLE VALUES ('') 
SET @IDOUT = (SELECT SCOPE_IDENTITY())  
+0

謝謝,這基本上是我認爲我必須做的。它不是整潔的,但如果它有效,那麼這是主要的。儘管我相信我必須將插入和更新放入兩個單獨的事務中才能完成這項工作。 – Russell 2009-12-02 23:56:19

+0

我寧願使用'INSERT INTO AuditTable DEFAULT VALUES' - 對我來說更清楚。 – 2009-12-03 06:03:52

2

您按照從審計中收到的XML插入XML。當呈現的數據,你可以製造同時包含原始的XML和身份的XML:

SELECT Id AS [Id] 
, OriginalXml AS [*] 
FROM AuditTable 
FOR XML PATH('...'), TYPE; 
+0

我喜歡這個主意,但因爲這是一個審計表,沒有(尚未)的清楚呈現,它可以由任何人使用(例如做商業智能報告)。我可以提及它,或者有一個這樣做的視圖。感謝Remus :) – Russell 2009-12-02 23:42:20

相關問題