503 messaggi dal 18 dicembre 2012
Ciao a tutti

Ho questa funzione:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[TariffeDisponibilita]
(  
  @minDays INT,
  @dStart DATE,
  @dEnd DATE,
  @CodiceStruttura NVarchar(50),
  @Adulti INT,
  @Dove1 NVarchar(MAX),
  @Dove2 NVarchar(MAX)
)
RETURNS 

@Risultato TABLE 
(
  codice_struttura NVarchar(30), 
  codice_camera NVarchar(30), 
  pax_min TinyInt, 
  pax_max TinyInt, 
  letto_aggiunto NVarchar(2), 
  letto_aggiunto_costo Money, 
  culla NVarchar(2), 
  culla_costo Money, 
  giorno Date, 
  modello NVarchar(20), 
  camere SmallInt, 
  release SmallInt, 
  fk_tariffa BigInt, 
    livello NVarchar(20), 
  costo Money, 
  commissioni_portale TinyInt,
  struttura NVarchar(250)
)
AS
BEGIN 
 WITH cte AS (
  ...
 )
  
  INSERT INTO @Risultato
 
  SELECT t.*, t1.struttura

    FROM dbo.vw_vp_tariffe t
  JOIN cte c ON t.giorno BETWEEN c.Dal AND c.Al AND c.codice_camera = t.codice_camera AND c.modello = t.modello AND c.livello = t.livello  

  GROUP BY  t.codice_struttura, t1.struttura,
    t.codice_camera, t.pax_min, t.pax_max, t.letto_aggiunto, t.letto_aggiunto_costo, t.culla, t.culla_costo,
    t.giorno,
    t.modello, t.camere, t.release,
    t.fk_tariffa, t.livello, t.costo,
    t.commissioni_portale
    
  ORDER BY t.codice_struttura, t.codice_camera, t.modello, t.livello, t.giorno

  RETURN
END


Perchè quando la richiamo il risultato non è ordinato?

Grazie mille
salve,
dipende dalla formulazione della query, che tecnicamente non e' una proiezione, dove l'ORDER BY ovviamente garantirebbe l'ordinamento, ma un inserimento in altra tabella virtuale, come codificato con
INSERT INTO @Risultato
SELECT ...
ORDER BY ...;

quindi il query optimizer effettivamente omette l'ordinamento in quanto irrilevante, dato che sara' il chiamante della fuzione che ottiene il table value della funzione ad eseguire, se e dove richiesto, l'ordinamento preferito...

Conor ne parlo' (tanto) tempo addietro in https://blogs.msdn.microsoft.com/sqltips/2005/07/20/ordering-guarantees-in-sql-server/

per cercare di "risolvere". molti utilizzano una colonna addizionale con proprieta' identity (il punto #4), in modo da "forzare" l'optimizer a generare un piano di esecuzione con rispetto di ordinamento, ma anche questo puo' dare risultati contraddittori... il punto cardine resta quindi il punto #1...

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.