Всем привет. Имеется: БД для 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)
)
?
Спосибо за вниманее.