Здравствуйте, 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
;
Всем привет. Имеется: БД для 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)
)
?
Спосибо за вниманее.
Здравствуйте, _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
___>;
___>
Спасибо! Работает.