Как получить список столбцов из этого поля XML SQL Server? - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть фрагмент xml, как в следующем примере, и я хотел бы получить список столбцов и превратить их в разделенный запятыми список, но я действительно изо всех сил пытаюсь выяснить синтаксис для работы с данными XMLТип и документация, которую я нашел, читаются как корейские инструкции по стерео: (

<ROOT>
<DATAVIEW>sp_Demo</DATAVIEW>
<WHERECLAUSE>X=4</WHERECLAUSE>
<COLUMNS>
  <COLUMN>ImageHTML</COLUMN>
  <COLUMN>Task_ID</COLUMN>
</COLUMNS>
</ROOT>

Может кто-нибудь указать мне на пример для начинающих или дать мне указание, как это сделать?

Отприведенный выше фрагмент XML я хотел бы вернуть строку, содержащую «ImageHTML, Task_ID»

Ну, это не красиво, но это помогает, спасибо за указатель Луи.

DECLARE MY_CURSOR Cursor
FOR 
Select  Substring(Substring(CAST(T.Item.query('.') AS varchar(50)),0,LEN(CAST(T.Item.query('.') AS varchar(50)))-8),9,LEN(CAST(T.Item.query('.') AS varchar(50))))
From @Data.nodes('ROOT/COLUMNS/COLUMN') AS T(Item) 

    Open MY_CURSOR
    DECLARE @ColumnName varchar(50)
    DECLARE @RunningTotal varchar(2000)
    SET @RunningTotal=''

    FETCH NEXT FROM MY_CURSOR INTO @ColumnName
    WHILE (@@Fetch_STATUS<>-1)
    BEGIN
    IF (@@FETCH_STATUS<>-2)
    IF LEN(@RunningTotal)>0 SET @RunningTotal=@RunningTotal+','
    SET @RunningTotal=@RunningTotal+@ColumnName

    FETCH NEXT FROM MY_CURSOR INTO @ColumnName
    END
    CLOSE MY_CURSOR
    DEALLOCATE MY_CURSOR

    PRINT @RunningTotal

FinalОбновление: в то время как моя версия курсора работала, Akash представил намного более аккуратное решение ниже.

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Вам не нужен курсор здесь.Вам нужны две вещи:

  • методы типа данных xml .nodes() и .value()
  • хорошо известная уловка для создания списка, разделенного запятыми, из набора строк

Настройка:

DECLARE @xml xml

SET @xml = '
<ROOT>
<DATAVIEW>sp_Demo</DATAVIEW>
<WHERECLAUSE>X=4</WHERECLAUSE>
<COLUMNS>
  <COLUMN>ImageHTML</COLUMN>
  <COLUMN>Task_ID</COLUMN>
</COLUMNS>
</ROOT>
'

Вывод:

DECLARE @output nvarchar(max)

SELECT
    @output = COALESCE(@output + ', ', '') + C.value('text()[1]', 'nvarchar(MAX)')
FROM
    @xml.nodes('//COLUMN') X(C)

SELECT @output

Объяснение:

.nodes() выполняет клочок XMLв ряды.В этом случае он запрашивает xml с xpath //COLUMN и создает набор строк с каждым соответствующим узлом в качестве строки.Этот набор строк связывается с таблицей с именем X с одним столбцом C.

. В предложении SELECT каждый узел xml имеет значение text(), извлеченное с помощью .value()

* 1031.* Трюк @output - это стандартный метод создания списка, разделенного запятыми.

Вывод:

ImageHTML, Task_ID

Надеемся, что эти термины и методы позволят вам найти соответствующие документы и примеры..

2 голосов
/ 13 сентября 2011

Это какая-то помощь?

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=61409

наслаждаться

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...