Параметр типа 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)
)

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