Объединение строк из разных таблиц в одно поле - PullRequest
1 голос
/ 10 июня 2009

В проекте, использующем базу данных MSSQL 2005, мы должны регистрировать все действия по обработке данных в таблице журналирования. Предполагается, что одно поле в этой таблице будет содержать строку до ее изменения. У нас много таблиц, поэтому я пытался написать хранимую процедуру, которая бы собирала все поля в одной строке таблицы, которая была ему передана, каким-то образом объединяла их, а затем записывала новую запись журнала с этой информацией. *

Я уже пытался использовать FOR XML PATH, и это сработало, но клиенту не нравятся нотации XML, ему нужно поле csv.

Вот что у меня было с FOR XML PATH:

DECLARE @foo varchar(max);
SET @foo = (SELECT * FROM table WHERE id = 5775 FOR XML PATH(''));

Значения "table", "id" и фактического идентификатора (здесь: 5775) будут позже переданы через вызов хранимой процедуры.

Есть ли способ сделать это, не получая нотацию XML и не зная заранее, какие поля будут возвращены оператором SELECT?

Ответы [ 2 ]

0 голосов
/ 14 марта 2010

Как насчет:

Set @Foo = Stuff(
                        ( Select ',' + MyCol1 + ',' + MyCol2 ...
                            From Table
                            Where Id = 5775 
                            For Xml Path('') 
                        ), 1, 1, '')

Это создаст строку CSV (при условии, что внутренний SQL возвращает одну строку). Теперь это решает вторую часть вашего вопроса. Что касается первой части «не зная заранее, какие поля», то нет средств сделать это без использования динамического SQL. То есть, вы должны построить оператор SQL как строку на лету. Если вы собираетесь это сделать, вы также можете получить весь результат CSV на лету.

0 голосов
/ 22 октября 2009

Мы использовали XML-путь, и, как вы обнаружили, он работает очень хорошо. Поскольку одной из функций SQL является правильное хранение XML, CSV не имеет смысла.

То, что вы можете попробовать - это сохраненный процесс, который считывает XML в формате CSV (подделка). Я мог бы. Поскольку вы вряд ли будете много читать данные по сравнению с их сохранением, накладные расходы незначительны.

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