Параметр типа XML
От: Warturtle  
Дата: 15.07.09 13:52
Оценка:
Всем привет. Имеется: БД для SQL Server 2005 (Express, если важно) и табличная функция:
CREATE FUNCTION dbo.ufnGetColumnRestrictionsTable 
(    
    @cols AS XML
    , @name AS VARCHAR(128)
    , @type AS INT
)
RETURNS @Restrictions TABLE 
(
    ColumnName VARCHAR(128) NOT NULL
    , RestrictType INT NOT NULL
    , RestrictValue NVARCHAR(MAX)
)
AS
BEGIN
    DECLARE @col XML
    
    SELECT 
        @col = X.C.query('./r')
    FROM 
        @cols.nodes('/col') AS X(C)
    WHERE 
        X.C.value('./@name', 'varchar(128)') = @name
    
    INSERT @Restrictions
    SELECT 
        @name AS ColumnName
        , C.R.value('./@type', 'int') AS RestrictType
        , C.R.value('.', 'nvarchar(max)') AS RestrictValue
    FROM 
        @col.nodes('/r') AS C(R)
    
    RETURN
END

— на вход этой функции подается XML вида:
<col name="LocalMessagesSize">
    <r type="7">1.5</r>
    <r type="9">1000.</r>
</col>
<col name="InternetMessagesCount">
    <r type="8">9000</r>
</col>
<col name="SenderAddress">
    <r type="1" />
    <r type="14">@domain.local</r>
    <r type="15">zzz</r>
</col>

Т.е. ufnGetColumnRestrictionsTable выбирает один элемент <col>..</col> и делает из него таблицу
Колонка | Тип ограничения 1 | Значение ограничения 1
...     | ...               | ...
Колонка | Тип ограничения N | Значение ограничения N

Можно ли переделать ufnGetColumnRestrictionsTable без использования временной переменной @col, чтобы было как-то так (не работает):
CREATE FUNCTION dbo.ufnGetColumnRestrictionsTable 
(    
    @cols AS XML
    , @name AS VARCHAR(128)
    , @type AS INT
)
RETURNS TABLE 
AS
RETURN
(
    WITH CTE AS (
        SELECT TOP 1
            X.C.query('./r') AS Col
        FROM 
            @cols.nodes('/col') AS X(C)
        WHERE 
            X.C.value('./@name', 'varchar(128)') = @name
    )
    SELECT 
        @name AS ColumnName
        , C.R.value('./@type', 'int') AS RestrictType
        , C.R.value('.', 'nvarchar(max)') AS RestrictValue
    FROM 
        CTE
        , CTE.Col.nodes('/r') AS C(R)
)

?
Спосибо за вниманее.
Re: Параметр типа XML
От: _d_m_  
Дата: 16.07.09 02:42
Оценка: 2 (1)
Здравствуйте, Warturtle, Вы писали:

Два часа мутохался с документацией, лови:
select
    @name,
    K.N.value('./@type', 'int') as RestrictType,
    K.N.value('.', 'nvarchar(max)') AS RestrictValue
from
    @xml.nodes('/col') as C(R)
        cross apply
    C.R.nodes('./r') as K(N)
where
    C.R.value('./@name', 'varchar(128)') = @name
;
Re[2]: Параметр типа XML
От: Warturtle  
Дата: 16.07.09 08:38
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, Warturtle, Вы писали:


___>Два часа мутохался с документацией, лови:

___>
___>select
___>    @name,
___>    K.N.value('./@type', 'int') as RestrictType,
___>    K.N.value('.', 'nvarchar(max)') AS RestrictValue
___>from
___>    @xml.nodes('/col') as C(R)
___>        cross apply
___>    C.R.nodes('./r') as K(N)
___>where
___>    C.R.value('./@name', 'varchar(128)') = @name
___>;
___>

Спасибо! Работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.