2016-05-01 8 views
0

Ich verwende Tabellenwert-Funktion in SQL Server, um Daten entweder mit Bindungen oder ohne unter bestimmten Bedingungen zurückgegeben werden.Tabellenwert-Funktion - Duplikat-Tabelle-Deklaration

Jetzt funktioniert die Lösung gut, aber ich mag nicht die Tatsache, dass ich die Tabelle zweimal deklarieren muss - gibt es Workarloud? Ich könnte wahrscheinlich anstelle in @tmp Tabelle Verwendung @ReturnTable einfügen, aber diese Daten müssten gelöscht werden, sobald select top 1 am Ende der Funktion abgefragt wird.

RETURNS @ReturnTable TABLE 
    (
    idTable INT, 
    idOther INT, 
    name  VARCHAR(30) 
    ) 
AS 
    BEGIN 
     DECLARE @tmp TABLE 
      ( 
      idTable   INT, 
      idOther   INT, 
      name   VARCHAR(30) 
      ) 

     INSERT INTO @tmp 
       SELECT idTable, 
         idOther,  
         name 
       FROM SomeTable 

     IF (some condition) 
      BEGIN 
       INSERT INTO @ReturnTable 
         SELECT TOP 1 WITH TIES idTable, 
               idOther,  
               name 
         FROM @tmp 
         ORDER BY (some ordering) 
      END; 
     ELSE 
      BEGIN 
       INSERT INTO @ReturnTable 
         SELECT TOP 1 idTable, 
            idOther,  
            name 
         FROM @tmp 
         ORDER BY (some other ordering) 
      END; 
     RETURN; 
    END; 
+0

'TOP' Verwendung erreicht werden kann, ohne' Auftrag By' nicht viel Sinn machen –

+0

Es ist ein Auftrag, lassen Sie mich das korrigieren. – Neutrino

Antwort

1

Versuchen Umschreiben Ihre Funktion Inline table valued function.

Basierend auf der Bedingung müssen Sie entweder ROW_NUMBER oder DENSE_RANK Fensterfunktion verwenden. TOP 1 with TIESDENSE_RANK/RANK

RETURNS TABLE 
AS 
    RETURN 
     (SELECT idtable, 
       idother, 
       NAME 
     FROM (SELECT CASE 
         WHEN (some condition) THEN Dense_rank()OVER(ORDER BY (some ordering)) 
         ELSE Row_number()OVER(ORDER BY (some other ordering)) 
         END  AS RN, 
         idtable, 
         idOther, 
         NAME 
       FROM sometable)a 
     WHERE RN = 1) 
Verwandte Themen