Объединение строк из хранимой процедуры в другую таблицу в TSQL

У меня есть таблица, которая содержит много значений NULL в поле электронной почты. Что мне нужно сделать, так это обновить все строки NULL. Для каждой строки NULL мне нужно выполнить хранимую процедуру, которая в основном получает все электронные письма, связанные с идентификатором этого пользователя. Поэтому для каждой строки NULL вызывается эта хранимая процедура, и все поля электронной почты, найденные в этой хранимой процедуре, должны быть объединены вместе и вставлены вместо поля электронной почты NULL из другой таблицы.

Кто-нибудь знает, как реализовать это в TSQL?

Спасибо заранее

РЕДАКТИРОВАТЬ:

Я нашел этот код:

WITH Ranked ( CategoryId, rnk, ProductName )  
             AS ( SELECT CategoryId,
                         ROW_NUMBER() OVER( PARTITION BY CategoryId ORDER BY CategoryId ),
                         CAST( ProductName AS VARCHAR(8000) ) 
                    FROM Northwind..Products),
   AnchorRanked ( CategoryId, rnk, ProductName )  
             AS ( SELECT CategoryId, rnk, ProductName 
                    FROM Ranked
                   WHERE rnk = 1 ),
    RecurRanked ( CategoryId, rnk, ProductName ) 
             AS ( SELECT CategoryId, rnk, ProductName 
                    FROM AnchorRanked
                   UNION ALL 
                  SELECT Ranked.CategoryId, Ranked.rnk,
                         RecurRanked.ProductName + ', ' + Ranked.ProductName
                    FROM Ranked
                   INNER JOIN RecurRanked 
                      ON Ranked.CategoryId = RecurRanked.CategoryId 
                     AND Ranked.rnk = RecurRanked.rnk + 1 )
    SELECT CategoryId, MAX( ProductName ) 
      FROM RecurRanked
     GROUP BY CategoryId;

Однако я не могу заставить его работать в моем случае.

По сути, вместо использования хранимой процедуры я могу просто использовать оператор select, чтобы получить одну строку со всеми необходимыми электронными письмами. По сути, мне нужно объединить эти возвращенные электронные письма в одну строку.


person seedg    schedule 22.02.2012    source источник
comment
Как ваша хранимая процедура возвращает электронные письма?   -  person Lamak    schedule 22.02.2012
comment
Я пытаюсь использовать эту ссылку: projectdmx.com/tsql/rowconcatenate.aspx, но я не могу заставить его работать. @Lamak Хранимая процедура просто возвращает список строк с электронными письмами.   -  person seedg    schedule 22.02.2012
comment
это должен быть хранимый процесс? UDF здесь будет более удобен, так как его можно вызвать внутри оператора TSQL.   -  person Marc Gravell    schedule 22.02.2012
comment
Похоже, вам нужно использовать рекурсивное выражение общей таблицы. Но очень сложно предложить точное решение без каких-либо образцов данных/табличных структур.   -  person GarethD    schedule 22.02.2012


Ответы (1)


Отсюда: http://geekswithblogs.net/nagendraprasad/archive/2009/03/13/convert-multiple-rows-into-one-row---sql-server.aspx

Преобразование нескольких строк в одну строку - SQL Server Поскольку мне нужно отправить электронную почту многим людям, мне нужно преобразовать несколько электронных писем в одну строку, разделенную точкой с запятой (;), у меня было много решений, но это старый тип решения, которое требует больше строк кода. Поскольку я хочу использовать одно- или двухстрочный код, который разрешится, я нашел три метода для своего решения, которые очень просты.

Способ 1:

DECLARE @str varchar(4000)
SET @str = (SELECT CONTACT_EMAIL + ';' FROM table FOR XML PATH(''))
SET @str = SUBSTRING(@str,1,LEN(@str)-1)
SELECT @str

Способ 2:

DECLARE @str varchar(4000)
SELECT @str = COALESCE(@str + ';', '') + CONTACT_EMAIL FROM table 
SELECT @str

Способ 3:

DECLARE @str varchar(4000)
SELECT DISTINCT STUFF( (SELECT CONTACT_EMAIL + ';'   from table FOR XML PATH('')),1,1,'')
SELECT @str

Возвращено несколько строк:

CONTACT_EMAIL
[email protected]
[email protected]
[email protected]

3 строки затронуты.

После выполнения одного из методов я получил результат как

ПОЧТА ДЛЯ СВЯЗИ

[email protected];[email protected];[email protected];

Затронут 1 ряд(ы).

person JonH    schedule 22.02.2012
comment
@Chris - нет проблем, но спасибо Google больше. В результате простой поиск Преобразовать строки в одну строку на сервере sql дал это. - person JonH; 22.02.2012
comment
Да, я гуглил, но нашел более сложные решения, как я упоминал в посте, которые отличались от того, что я пытался сделать. - person seedg; 22.02.2012