Как создать представление или функцию по запросу XML PATH? - PullRequest
3 голосов
/ 05 октября 2011

Я использую SSMS 2008 со следующим запросом:

DECLARE @TestData TABLE 
( 
     address_desc NVARCHAR(100)  NULL 
    ,people_id UNIQUEIDENTIFIER  NULL 
); 

INSERT  @TestData 
SELECT a.address_desc, a.people_id 
FROM dbo.address_view a 

SELECT  a.people_id, 
    (SELECT SUBSTRING( 
        (SELECT ';'+b.address_desc 
        FROM    @TestData b  
        WHERE   a.people_id = b.people_id 
        FOR XML PATH('')) 
        ,2 
        ,4000) 
    ) GROUP_CONCATENATE 
FROM    @TestData a 
GROUP BY a.people_id 

Этот запрос работает, но я хочу превратить его в представление или функцию, чтобы я мог вызывать его из разных хранимых процедур.Как я могу это сделать?Насколько я понимаю, переменные не могут быть объявлены в операторах VIEW.

Hong, вот мой обновленный запрос, основанный на вашем совете, который дает мне ошибки:

DECLARE @TestData TABLE 
( 
     address_desc NVARCHAR(100)  NULL 
    ,people_id UNIQUEIDENTIFIER  NULL 
); 

INSERT  @TestData  
SELECT a.address_desc, a.people_id  FROM dbo.address_view a 

SELECT  a.people_id, 
(SELECT address_desc, people_id FROM dbo.address_view),
    (SELECT SUBSTRING( 
        (SELECT ';'+b.address_desc 
        FROM    @TestData b  
        WHERE   a.people_id = b.people_id 
        FOR XML PATH('')) 
        ,2 
        ,4000) 
    ) GROUP_CONCATENATE 
FROM    @TestData a 
GROUP BY a.people_id 

1 Ответ

3 голосов
/ 05 октября 2011

В последнем запросе выбора замените @TestData подзапросом (SELECT address_desc, people_id FROM dbo.address_view), а затем избавьтесь от временной таблицы @ TestData.

Попробуйте:

Create View YourView As
    SELECT  a.people_id,      
            (SELECT SUBSTRING(          
                    (SELECT ';'+b.address_desc          
                     FROM    (SELECT address_desc, people_id FROM dbo.address_view) b           
                     WHERE   a.people_id = b.people_id          
                     FOR XML PATH(''))          
                     ,2          
                     ,4000)      
                     ) GROUP_CONCATENATE  
    FROM    (SELECT address_desc, people_id FROM dbo.address_view) a  
    GROUP BY a.people_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...