2016-05-13 20 views
0

Ich habe eine skalare Funktion, die eine Ganzzahl als eine ihrer Eingaben verwendet. Ich brauche eine Abfrage, die diese Funktion für den Satz von ganzen Zahlen (1,2,3,4,5) ausführt. Das habe ich bisher gemacht:Wählen Sie fortlaufende Nummern als Zeilen, die als Eingaben für eine benutzerdefinierte Funktion dienen.

SELECT dbo.MyFunction('2016-05-13', Number) 
FROM (SELECT TOP 5 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Number FROM SomeTable) AS T 

Und das funktioniert. Gibt es eine Möglichkeit, dass ich es ohne die tun kann, da ich tatsächlich keine Informationen in der Tabelle verwenden?

Gibt es alternativ eine sauberere Möglichkeit, die gesamte Abfrage zu schreiben?

+1

Es sollte angemerkt werden, dass Ihre aktuelle Abfrage nicht definiert ist. Wenn 'SomeTable' mehr als 5 Zeilen enthält, gab es * keine * Garantie, dass Sie tatsächlich 5 Zeilen mit den Zahlen 1-5 abrufen würden . –

+0

Vielleicht wäre es ein besserer Ansatz, diesen Prozess zu überdenken. Anstatt eine Skalarfunktion zu verwenden (die fürchterlich ineffizient ist), könnten Sie dies als eine Inline-Tabellenwertfunktion, die eine Tally-Tabelle verwendet, überdenken. Es wäre schneller und flexibler als eine Skalarfunktion immer wieder aufzurufen. Wenn Sie den Inhalt Ihrer Funktion teilen können, werde ich etwas zusammenstellen, um dies zu demonstrieren. –

+0

@SeanLange Leistung ist hier nicht wirklich ein Problem, ich muss nur einmal am Tag diese Werte in eine Tabelle ziehen. Danke trotzdem. – Dan

Antwort

1

Seit SQL Server 2008, haben wir table value constructors:

SELECT dbo.MyFunction('2016-05-13', Number) 
FROM (VALUES (1), (2), (3), (4), (5)) AS T(Number) 

Wenn „5“ ist eine willkürliche Zahl, und Sie müssen diese alle sequenziellen Reihenfolge zu überfahren, werden Sie noch eine nums Tabelle einiger verwenden müssen Sortieren. Anstatt die verschiedenen Techniken dafür hier zu wiederholen, beziehe ich mich auf this question und seine Antworten.

+0

Perfekt, das ist, was ich gesucht habe. – Dan

+0

Entschuldigung für diese Zusatzfrage, aber wenn ich das Ergebnis von 'dbo.MyFunction' in einer' WHERE'-Klausel verwenden möchte, muss ich das in eine äußere Abfrage verschachteln? – Dan

+0

Wenn Sie die Ergebnisse in einem 'WHERE' wirklich verwenden möchten, verwenden Sie zunächst eine Inline-Tabellenwertfunktion. Skalarfunktionen haben eine schreckliche Leistung. Als zusätzlichen Bonus, wenn Sie "CROSS APPLY" verwenden, ergeben sie eine Spalte, die leicht in einer 'WHERE' gefiltert werden kann. –