Как вставить столбец идентификатора идентификатора в данные XML в таблице SQL Server? - PullRequest
0 голосов
/ 03 декабря 2009

В моей базе данных SQL Server 2008 есть таблица аудита, которая содержит XML для данных, которые я проверяю.

Однако внутри этого XML мне требуется идентификатор записи аудита в таблице аудита.

Загвоздка в том, что идентификатор представляет собой столбец идентификаторов.

Так что это своего рода ловушка 22, я не могу вставить XML, пока не узнаю идентификатор, и не могу найти идентификатор, пока не вставлю XML.

Мне нужно, чтобы поле идентификатора было столбцом идентификаторов, и мне нужен идентификатор в XML.

Как я могу это сделать?

Редактировать

С точки зрения блокировки 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  

Почему это работает? Должен ли я использовать это?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

Вы вставляете XML, как вы получили его от аудита. При представлении данных вы можете создать XML, который содержит как исходный XML, так и удостоверение:

SELECT Id AS [Id]
 , OriginalXml AS [*]
FROM AuditTable
FOR XML PATH('...'), TYPE;
1 голос
/ 03 декабря 2009

Один из способов - вставить пустую запись с помощью хранимой процедуры. Хранимая процедура будет иметь выходной параметр, который будет заполнен идентификатором вновь вставленной строки. Ваше приложение может прочитать значение идентификатора после вставки данных XML. Затем хранимая процедура обновления может принять идентичность и данные XML в качестве параметров для обновления вновь вставленной строки. Недостатком является то, что это требует вставки и обновления.

 CREATE PROCEDURE [dbo].[cp_InsertForID]    
 (    
 @IDOUT INT = NULL OUTPUT
 )    
 AS
 INSERT INTO AUDITABLE VALUES ('')
 SET @IDOUT = (SELECT SCOPE_IDENTITY())    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...