У меня есть столбец в моей таблице с XML, который выглядит следующим образом:Синтаксический XML из отборного заявления
<Notes> <Note>
<Author>test</Author>
<AuthorInitials>JJJ</AuthorInitials>
<Contents>Test treatment notes 3</Contents>
<DateCreated>2013-07-17T14:43:00</DateCreated>
<DateModified>2013-07-17T14:43:00</DateModified>
</Note>
<Note>
<Author>test</Author>
<AuthorInitials>JJJ</AuthorInitials>
<Contents>This is the intial notes test for tasks</Contents>
<DateCreated>2013-07-17T14:36:00</DateCreated>
<DateModified>2013-07-17T14:36:00</DateModified>
</Note>
<Notes> <Note>
<Author>test</Author>
<AuthorInitials>JJJ</AuthorInitials>
<Contents>Test 4 of Task Notes</Contents>
<DateCreated>2013-07-17T14:57:00</DateCreated>
<DateModified>2013-07-17T14:57:00</DateModified>
</Note>
<Note>
<Author>test</Author>
<AuthorInitials>JJJ</AuthorInitials>
<Contents>This is the second note test for tasks</Contents>
<DateCreated>2013-07-17T14:37:00</DateCreated>
<DateModified>2013-07-17T14:37:00</DateModified>
</Note>
И я хочу, чтобы разобрать до конца и просто получить <Contents>
часть его. Некоторые поля имеют несколько <Contents>
, поэтому мне нужно иметь возможность вытащить все из них.
Я думал, что нужно использовать курсор и хранить результаты в таблице, но я все еще новичок в SQL Server, и я не думаю, что полностью их понимаю.
Вот что я в настоящее время:
DECLARE @temptable TABLE
(
Category varchar(5000),
Notes varchar(5000)
)
DECLARE @Contents varchar(5000)
DECLARE c CURSOR FOR SELECT COMMENTS
FROM EVENT
WHERE COMMENTS <> ''
AND COMMENTS IS NOT NULL
AND ID = 1171438
OPEN c
FETCH NEXT FROM c INTO @Contents
WHILE (@@FETCH_STATUS = 0)
BEGIN
INSERT INTO @temptable (Category, Notes)
SELECT 'Notes',
SUBSTRING(COMMENTS,
(CHARINDEX('<Contents>',
COMMENTS)+10),
(CHARINDEX('</Contents>',
COMMENTS)-CHARINDEX('<Contents>',
COMMENTS)-10))
FROM Event
WHERE COMMENTS <> ''
AND COMMENTS IS NOT NULL
AND ID = 1171438
FETCH NEXT FROM c INTO @Contents
END
CLOSE c
DEALLOCATE c
SELECT *
FROM @temptable
Но это только возвращает:
Notes | Test treatment notes 3
Notes | Test 4 of Task Notes
Notes | Test treatment notes 3
Notes | Test 4 of Task Notes
Любая идея, что я не хватает?
EDIT: Решение, которое работало:
DECLARE @temptable TABLE
(
Category varchar(5000),
Notes XML
)
INSERT INTO @temptable (Category, Notes)
SELECT 'Notes',
COMMENTS
FROM Event
WHERE COMMENTS <> ''
AND COMMENTS IS NOT NULL
AND ID = 1171438
SELECT Category,
Content = XNote.value('(Contents)[1]', 'varchar(5000)')
FROM @temptable
CROSS APPLY Notes.nodes('/Notes/Note') AS Xtbl(Xnote)
Ahh wow, не было этого в настоящее время! Спасибо! Делает это намного проще :-) – rjbogz
Работал красиво. Добавлено, что работало выше. – rjbogz