2016-07-01 34 views
3

Ich versuche, eine gespeicherte Prozedur basierend auf einer Abfrage zu erstellen, die ich mit vordefinierten Parametern schrieb.Gespeicherte Prozedur mit Standardparametern

Bei der Umstrukturierung in eine erstellte gespeicherte Prozedur und ich die gespeicherte Prozedur ausführen besagt, dass die Parameter nicht angegeben wurden. Kann mir jemand sagen warum?

Ich weiß, dass ich etwas Wesentliches verpasst habe, aber nachdem ich mit dem Code herumgespielt habe, habe ich den Punkt erreicht, dass ich Hilfe von Experten brauche.

Dies ist mein Code (verkürzt):

Alter Procedure [Test] 
    @StartDate AS varchar(6), 
    @EndDate AS varchar(6) 
AS 
    Set @StartDate = '201620' --Define start YearWeek 
    Set @EndDate = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2))) 

    SELECT 
     * 
    FROM 
     (SELECT DISTINCT 
      [YEAR], [WeekOfYear] 
     FROM 
      [dbo].[DimDate] 
     WHERE 
      [Year] + [WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd 
    LEFT JOIN 
     [Schema].[Table1] qad ON (qad.[Year] + qad.[Week of the Year]) = (dimd.[Year] + dimd.WeekOfYear) 

Wenn ich die Prozedur ausführen, erhalte ich:

Msg 201, Ebene 16, Status 4, Verfahrensprüfung, Zeile 0
Verfahren oder die Funktion 'test' erwartet den Parameter '@StartDate', der nicht geliefert wurde.

Vielen Dank im Voraus.

+0

Warum fragen Sie nach '@ StartDate' und' @ EndDate' als Parameter, wenn Sie sie in Ihrem tsql setzen? deklariere sie einfach in der t-sql und es sollte gut laufen – jellz77

+3

Wenn diese Parameter 'StartDate' und' EndDate' heißen - *** warum auf EARTH *** sind sie vom Typ 'varchar (6)' ?? Du solltest * immer * den geeignetsten Datentyp verwenden - und eine Zeichenkette ist definitiv nicht die beste Wahl für ein ** Datum ** - benutze 'DATE' oder' DATETIME2 (n) 'für irgendwas Datumsbezogenes! –

+0

Ihr Titel bezieht sich auf Standardeinstellungen, Sie geben jedoch keine an. Sie könnten den Deklarationen '= null 'hinzufügen, um ihnen die Standardwerte zu geben, und dann wäre es möglich,' exec 'auszuführen, ohne sie zu übergeben. Bestehende Antworten weisen bereits auf einige andere Korrekturen hin. – shawnt00

Antwort

5

Ich schrieb mit Parametern, die vordefiniert

Sie sind nicht "vordefiniert" logisch irgendwo in Ihrem Code. Aber als Argumente von SP haben sie keine Standardwerte und sind erforderlich. Um zu vermeiden, diese params vorbei explizit müssen Sie Standardwerte in SP-Definition definieren:

Alter Procedure [Test] 
    @StartDate AS varchar(6) = NULL, 
    @EndDate AS varchar(6) = NULL 
AS 
... 

NULLs oder leere Strings oder etwas mehr sinnvoll - bis zu Ihnen. Es spielt keine Rolle, da Sie Werte dieser Argumente in den ersten Zeilen von SP überschreiben.

Jetzt können Sie es aufrufen, ohne Argumente z. exec dbo.TEST

+0

Dank @ Ivan-Starostin Ich weiß jetzt, was ich getan habe. Sowie ein bisschen albern. Ich werde später Parameter übergeben, wenn ich das Excel-Frontend erstelle, so dass ich sie nicht mit Null versehen habe. Jetzt geht es :) –

0

Ich würde dies auf eine von zwei Arten tun. Da Sie Ihre Start- und Enddaten in Ihrem T-SQL-Code sind einstellen, fragen würde ich nicht für Parameter in der gespeicherten proc

Option 1

Create Procedure [Test] AS 
    DECLARE @StartDate varchar(10) 
    DECLARE @EndDate varchar(10) 
    Set @StartDate = '201620' --Define start YearWeek 
    Set @EndDate = (SELECT CAST(DATEPART(YEAR,getdate()) AS varchar(4)) + CAST(DATEPART(WEEK,getdate())-1 AS varchar(2))) 

SELECT 
* 
FROM 
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd 
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear) 

Option 2

Create Procedure [Test] @StartDate varchar(10),@EndDate varchar(10) AS 

SELECT 
* 
FROM 
    (SELECT DISTINCT [YEAR],[WeekOfYear] FROM [dbo].[DimDate] WHERE [Year]+[WeekOfYear] BETWEEN @StartDate AND @EndDate) dimd 
    LEFT JOIN [Schema].[Table1] qad ON (qad.[Year]+qad.[Week of the Year]) = (dimd.[Year]+dimd.WeekOfYear) 

Dann laufen exec test '2016-01-01','2016-01-25'

+0

auch, würden Sie wahrscheinlich Ihre 'varchar' auf die entsprechende Anzahl von Zeichen setzen ... Ich verwendete 10, aber Sie brauchen 6 pro Originalpost – jellz77