2016-07-21 10 views
0

Ich frage mich, ob es möglich ist, eine benutzerdefinierte Funktion zu erstellen, die einen Parameter unterschiedlicher Länge (sowie andere Parameter) annehmen kann.SQL Server: benutzerdefinierte Funktionsparameter

Im Wesentlichen möchte ich einen Parameter übergeben, der dann in einer IN Anweisung verwendet wird. Was würde Ich mag es, etwas zu tun, wie diese:

CREATE FUNCTION ufnGetOpenNotificationValue 
    (@LegacyTypeID INT, 
    @MonthEnd DATE, 
    @YearStart DATE, 
    @YearEnd DATE) 

Wo @LegacyTypeID ist eine Liste von ganzen Zahlen.

So dann die Funktion mit so etwas wie dieses

SELECT RE_Auxiliary.dbo.ufnGetOpenNotificationValue 
    ((1,2,3),'2014-07-31','2013-09-01','2014-08-31') 

statt

SELECT RE_Auxiliary.dbo.ufnGetOpenNotificationValue 
     (1,'2014-07-31','2013-09-01','2014-08-31') + 
    RE_Auxiliary.dbo.ufnGetOpenNotificationValue 
     (2,'2014-07-31','2013-09-01','2014-08-31') + 
    RE_Auxiliary.dbo.ufnGetOpenNotificationValue 
     (3,'2014-07-31','2013-09-01','2014-08-31') 

aussehen könnte, aber wenn ich versuche, und mehrere ganze Zahlen passieren Ich erhalte eine Fehlermeldung,

Incorrect syntax near ',' 
+2

* Tabelle Wertparameter * sind etwa so nah wie Sie bekommen können Z. B. [Übergeben Sie die Tabelle als Parameter an die SQL-Server-UDF] (http://stackoverflow.com/questions/1609115/pass-table-as-parameter-into-sql-server-udf) - Sie können variadic-Argumente nicht übergeben. –

+0

Danke @Alex K. - Ich denke, ich würde bleiben, um die Funktion 3 mal aufrufen und summieren, wenn die Liste länger wäre ich könnte die Tabelle Methode vorgeschlagen haben – RickyTillson

Antwort

1

Wie Alex K sagt, können Sie Arrays nicht als Eingabe für eine SQL-Funktion übergeben. Sie können Tabellentypen übergeben (Pass table as parameter).

CREATE TYPE TableType 
AS TABLE (LegacyTypeID INT) 

CREATE FUNCTION ufnGetOpenNotificationValue 
(@LegacyTypeID TableType, 
@MonthEnd DATE, 
@YearStart DATE, 
@YearEnd DATE) 
... 
WHERE COLUMN_NAME IN (SELECT LegacyType FROM @LegacyTypeID) 

Sie würden dann in eine Table Variable einfügen müssen, bevor Sie Ihre Funktion mit dieser Variable übergeben als Parameter

Eine weitere Option in der Liste in passieren würde Aufruf als eine durch Kommata getrennte Liste von Werten. Und dann eine Funktion (like this one) verwenden in Ihrer where-Klausel verwenden

CREATE FUNCTION ufnGetOpenNotificationValue 
(@LegacyTypeID NVARCHAR(256), 
@MonthEnd DATE, 
@YearStart DATE, 
@YearEnd DATE) 
... 
WHERE COLUMN_NAME in (SELECT val FROM dbo.f_split(@StringParameter, ',')) 

Was du dann so nennen könnte:

SELECT RE_Auxiliary.dbo.ufnGetOpenNotificationValue 
('1,2,3','2014-07-31','2013-09-01','2014-08-31') 
+0

Dank @Alex Fletcher, Erstellen einer anderen Funktion, ein Komma zu trennen Die separate Liste scheint eine elegante Lösung zu sein und nicht so umständlich wie die von Alex K. empfohlenen Table Valued Parameters – RickyTillson

Verwandte Themen