2017-01-25 9 views
2

Ich habe eine Spalte vom Typ von datetime, die ich in meiner gespeicherten Prozedur benutze, indem ich die zwei lokalen Variablen als @From datetime and @To datetime deklariere, aber egal was ich mache, bekomme ich den Fehler oder einfach den gespeicherten Prozedur, ohne irgendwelche Datensätze zurückzugeben (vollständig leer).Datumsumwandlung in gespeicherter Prozedur tsql

set @mySql =' 
select * from abc where (MyDATE between '''+ cast(@From as datetime) +''' and '''+ cast(@To as datetime)+''')' 
+1

Sie müssen lokale Variablen in varchar umwandeln, um sie in einer dynamischen Abfrage zu verwenden. –

+1

Wie gehst du die Parameter? Wenn Sie sie als typisierte Parameter übergeben (und das sollten Sie tun!), Müssen keine Umwandlungen durchgeführt werden. Datumsangaben sind besonders anfällig für Fehler aufgrund von Kultur/Spracheinstellungen ... – Shnugo

+0

Sie haben gerade gesehen, dass Sie dynamisches SQL erstellen ... Warum? Zumindest mit dem Schnipsel gegeben, ist dies nicht notwendig ... – Shnugo

Antwort

1

Versuchen Sie, Ihre Daten möglichst in Variablen des entsprechenden Typs zu speichern.

Zum Beispiel, hier können Sie tun:

[email protected] and @To are declared previously as datetimes 
set @mySql ='select * from abc where (MyDATE between @From and @To)' 

--Other code that constructs/works on @mySQL 

--Finally, run the dynamic sql: 
EXEC sp_executesql @mySql, 
        '@From datetime,@To datetime`, 
        @From, 
        @To 

Und sollte alles schön arbeiten, weil Sie sich nicht hin und her zwischen Streichern und datetime s zwingen und seine jenen Konvertierungen, die die Möglichkeit vorstellen habe Formatierungsprobleme.

2

Der einzige „richtige“ Weg, dies zu tun ist, um sie zu bewahren als in der dynamischen SQL-Parametern. Zum Beispiel:

set @mySql =N'select * from abc where MyDATE between @from and @to'; 

exec sp_executesql @mySql, N'@from datetime, @to datetime', @fromOuter, @toOuter; 

Dieses sie richtig eingegeben im dynamischen Code hält und vermeidet beide Formatierung Anliegen und SQL-Injection-Risiken. Beachten Sie, dass die Namen innerhalb und außerhalb des dynamischen Codes nicht übereinstimmen müssen, wie im obigen Beispiel gezeigt (@from und @to sind die Namen im dynamischen Code; @fromOuter und @toOuter sind die Namen im aufrufenden Code).

Beachten Sie, dass es egal ist, ob Sie mehr Parameter übergeben als Sie tatsächlich verwenden (dies wäre für eine dynamische Filtermethode ziemlich normal).

Verwandte Themen