Sql For Xml Path получить количество узлов - PullRequest
3 голосов
/ 03 сентября 2010

Я пытаюсь использовать T-SQL 'For Xml Path' для создания списка значений, разделенных запятыми, из столбца.Кажется, это работает отлично, но проблема в том, что я хотел бы получить количество элементов в списке через запятую.Вот пример кода, который я использую для создания списка, разделенного запятыми:

Create Table #List ([col] varchar)

Insert Into #List Select '1';
Insert Into #List Select '2';
Insert Into #List Select '3'

Select ',' + [col] From #List For Xml Path('')

Это дает результаты 1,2,3, как и ожидалось, но нет способа получить счетчик, что есть3 предмета.Любая попытка добавить счетчик просто добавит его в xml.Я объединил этот код с cte, чтобы получить счет:

With CTE As (
    Select 
        [col] 
    From 
        #List
)
Select
   (Select ',' + [col] From #List For Xml Path('')) As [List],
   Count(*) As [Count]
From
   CTE

Есть ли более простой / понятный способ получить количество узлов без использования CTE?Было отмечено, что вы можете просто продублировать предложение from внутри внутреннего select и outside, но для этого необходимо синхронизировать предложения from.Я хочу получить и список, и количество, но предложение from написано только один раз.

Ответы [ 2 ]

2 голосов
/ 04 сентября 2010

Как насчет рисования данных из CTE вместо временной таблицы?

With CTE As (
    Select 
        [col] 
    From 
        #List
    -- Many joins
    -- Complicated where clause
)
Select
   (Select ',' + [col] From Cte For Xml Path('')) As [List],
   Count(*) As [Count]
From
   CTE

Это позволит вам хранить свои объединения и предикаты поиска в одном месте.

1 голос
/ 03 сентября 2010

Вам не нужен CTE, вы можете использовать подход подзапроса напрямую

SELECT 
      COUNT(*) AS [Count], 
      (SELECT ',' + [col] FROM #List FOR XML PATH('')) AS [List]
FROM #List
...