SQL: Упорядочение данных, выдаваемых табличной функцией

ReG_67
Дата: 23.02.2010 16:13:07
Есть табличная функция - вот её "тело":
RETURNS TABLE
AS
RETURN WITH table(ACC_ID, ACCOUNT, ISO ,DT,DBO,CRO,AMOUNT) AS
(
SELECT
A.ACC_ID
,A.ACCOUNT
,A.ISO COLLATE Latin1_General_BIN
,S.DT
,S.DBO
,S.CRO
,S.SALDO AMOUNT
FROM Core.Table1 AS S (NOLOCK)
INNER JOIN Core.Table 2 AS A (NOLOCK)
ON S.ACC_ID = A.ACC_ID
WHERE S.ACC_ID=@AccID
AND DT<(SELECT MAX(VALS) FROM Core.Table3(NOLOCK) ) UNION ALL
SELECT
ACC_ID,ACCOUNT, ISO,DT,DBO,CRO,AMOUNT
FROM dbo.Function1(@AccID,NULL,NULL)
)

SELECT
S.ACC_ID,
S.ACCOUNT,
S.ISO,
D.StartPeriod DT,
CASE WHEN IsVirtual=1 THEN 0 ELSE DBO END DBO,
CASE WHEN IsVirtual=1 THEN 0 ELSE CRO END CRO,
AMOUNT,
IsVirtual
FROM(
SELECT DL.FullDateAlternateKey StartPeriod,
MAX(S.DT) AS DT,
CASE WHEN DL.FullDateAlternateKey<>MAX(S.DT) THEN 1 ELSE 0 END IsVirtual
FROM Table4 AS DL WITH (INDEX(AK_DimTime_FullDateAlternateKey))
LEFT JOIN table AS S
ON DL.FullDateAlternateKey>=S.DT
WHERE DL.FullDateAlternateKey >= @StartDate AND DL.FullDateAlternateKey <= @EndDate
GROUP BY DL.FullDateAlternateKey
) D
INNER JOIN SALDOS S
ON D.DT=S.DT

хотелось бы, чтобы выдавалась таблица упорядоченная по дате DT. Ордеринг и оптимизаторы не работают, индексация не помогает.
Может есть какой-нибудь выход? Заранее спасибо!
Паганель
Дата: 23.02.2010 16:15:21
А в каком запросе Вы используете эту функцию?
Glory
Дата: 23.02.2010 16:17:56
ReG_67

хотелось бы, чтобы выдавалась таблица упорядоченная по дате DT. Ордеринг и оптимизаторы не работают, индексация не помогает.
Может есть какой-нибудь выход? Заранее спасибо!


When ORDER BY is used in the definition of a view, inline function, derived table, or subquery, the clause is used only to determine the rows returned by the TOP clause. The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.
ReG_67
Дата: 23.02.2010 16:25:21
Паганель
А в каком запросе Вы используете эту функцию?


Да хотя бы:

Select * from Func()

дело в том, что желательно, чтобы она выдавала именно упорядоченные значения, понятно, что ордеринг можно использовать уже во время вызова функции в запросе.
ReG_67
Дата: 23.02.2010 16:27:10
Glory
ReG_67

хотелось бы, чтобы выдавалась таблица упорядоченная по дате DT. Ордеринг и оптимизаторы не работают, индексация не помогает.
Может есть какой-нибудь выход? Заранее спасибо!


When ORDER BY is used in the definition of a view, inline function, derived table, or subquery, the clause is used only to determine the rows returned by the TOP clause. The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.


Вот-вот, именно так - есть ли какое-нибудь решение проблемы?
Glory
Дата: 23.02.2010 16:28:57
ReG_67
Glory
ReG_67

хотелось бы, чтобы выдавалась таблица упорядоченная по дате DT. Ордеринг и оптимизаторы не работают, индексация не помогает.
Может есть какой-нибудь выход? Заранее спасибо!


When ORDER BY is used in the definition of a view, inline function, derived table, or subquery, the clause is used only to determine the rows returned by the TOP clause. The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.


Вот-вот, именно так - есть ли какое-нибудь решение проблемы?

"unless ORDER BY is also specified in the query itself"
Паганель
Дата: 23.02.2010 16:35:43
ReG_67
Да хотя бы:
Select * from Func()
Допишите в конце order by DT
ReG_67
понятно, что ордеринг можно использовать уже во время вызова функции в запросе
вот и хорошо
результат достигнут
ReG_67
Дата: 23.02.2010 16:45:01
Паганель,

Желательно , чтобы функция выдавала уже упорядоченные данные!
Паганель
Дата: 23.02.2010 16:47:36
ReG_67
Желательно , чтобы функция выдавала уже упорядоченные данные!
При использовании ее в любом запросе?
Даже в таком
Select * from Func() order by desc
?
ReG_67
Дата: 23.02.2010 16:51:23
Паганель
ReG_67
Желательно , чтобы функция выдавала уже упорядоченные данные!
При использовании ее в любом запросе?
Даже в таком
Select * from Func() order by desc
?


При таком запросе не важно в каком порядке выдает функция данные, ордеринг наложится на результат запроса. Мне же нужно, чтобы функция выдавала упорядоченные данные