2017-06-07 9 views
0

Die unter dynamischen SQL smalldatetime wirft einen Fehler:SQL Server - Konvertieren in dynamische SQL-Anweisung

The conversion failed when converting character string to smalldatetime data type

Mein Code:

DECLARE @pTimeStamp smalldatetime 
SET @pTimeStamp = '2017-05-22 12:15:00' 

DECLARE @SQLQuery AS NVARCHAR(4000) 
Set @SQLQuery = N'Select *' + 
' From SampleTable' + 
' Where TimeStamp = ' + @pTimeStamp 

EXECUTE sp_executesql @SQLQuery 

Ich habe auch versucht

Convert(smalldatetime, @pTimeStamp, 20) 

sowie

CAST(@pTimeStamp AS smalldatetime) 

aber ich bekomme nur andere Fehler. Ich habe auch versucht, @pTimeStamp als varchar(50) zu deklarieren und dann konvertieren, aber immer noch Fehler.

Etwas zu tun, einfach wie:

DECLARE @pTimeStamp smalldatetime 
SET @pTimeStamp = '2012-01-22 12:15:00' 

Select * 
From SampleTable 
Where TimeStamp = @pTimeStamp 

lief gut, so vermute ich es mit der dynamischen SQL zu tun hat.

Bitte helfen ....

+0

Jedes Mal, wenn ich in ein Problem wie thi laufen s Ich füge einen PRINT zu meinem Code hinzu, um zu sehen, wie mein dynamischer SQL aussieht. –

+0

Warum schreiben Sie eine solche Abfrage? Warum verwenden Sie keine parametrisierten Abfragen? –

+1

Warum verwenden Sie dynamische SQL hier an erster Stelle? Von dem, was Sie gepostet haben, ist kein dynamischer SQL erforderlich. Und wenn Sie das tun, sollten Sie es parametrisieren. –

Antwort

2

Die einzige wirklich sichere Formate für Datum/Zeit in SQL-Server, zumindest für datetime und smalldatetime sind: YYYYMMDD und YYYY-MM-DDThh:mm:ss[.nnn] - Bad habits to kick : mis-handling date/range queries - Aaron Bertrand

Sie sind bereits sp_executesql verwenden, also warum nicht Nutzen Sie seine Parameter?

declare @pTimeStamp smalldatetime; 
declare @params nvarchar(4000); 
declare @sqlquery nvarchar(4000); 

set @pTimeStamp = '2017-05-22T12:15:00'; 
set @params = N'@pTimeStamp smalldatetime'; 
set @sqlquery = N' 
select * 
from SampleTable 
where TimeStamp = @pTimeStamp'; 

execute sp_executesql @sqlquery, @params, @pTimeStamp; 

rextester Demo: http://rextester.com/FVC44260


dynamische SQL-Referenz:

+0

Eureka! Danke SqlZim .... vor allem für den Beispielcode. Das Nachschlagen von parametrisierten Abfragen hat die Dinge nur schwer gemacht, aber Ihr Code hat daraus einen Sinn ergeben. Das "T" in der Mitte des Wertes verwirrt mich als die gespeicherten Werte, um es nicht zu haben, und ich habe es in meinem Parameter des SP nicht eingeschlossen. Ich werde versuchen, herauszufinden, wofür es verwendet wird, wie ich es bei meinen Suchen verwendet habe. Danke noch einmal! –

+0

@TiltingCode Glücklich zu helfen! Wenn Sie den zugehörigen Artikel lesen, erklärt er, was das 'T' dort macht. [Schlechte Angewohnheiten, um zu kicken: Fehler bei Datums-/Bereichsabfragen - Aaron Bertrand] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date- Bereich-Abfragen.aspx). - Grundsätzlich bedeutet "T", dass das Literal trotz der Spracheinstellungen als ISO-Format erkannt wird. – SqlZim

0

Sie müssen die Zeitstempel in einfachen Anführungszeichen einbetten. Versuchen:

Set @SQLQuery = N'Select *' + 
' From SampleTable' + 
' Where TimeStamp = ''' + @pTimeStamp + '''' 
+3

Das ist eine schlechte Idee. Das OP muss keinen * Parameter * anstelle von String-Verkettung verwenden. Dies ermöglicht nicht nur SQL-Injection-Angriffe, sondern führt auch zu Konvertierungs- und Analyseproblemen. Es ist viel einfacher, eine korrekte Abfrage zu schreiben –

+0

@PanagiotisKanavos Schlecht? Nicht unbedingt. Die Variable '@ pTimeStamp' hat den Typ 'smalldatetime'. Es gibt keine Möglichkeit zur SQL-Injektion. Die Anweisung * müsste * bei jeder Ausführung neu kompiliert werden. Hast du noch etwas anderes? –

+1

Eigentlich ja. Vor allem, wenn dies die eigentliche Aussage ist, ist es nicht notwendig, dynamisches SQL zu verwenden. Wenn der Parameter von einer anderen Quelle kommt, sind sowohl Injektions- als auch Konvertierungsfehler möglich. Sie * verlieren * immer noch die Parametriervorteile und erzeugen redundante Ausführungspläne. Sie können eine fehlerhafte Abfrage nicht durch Hinzufügen von Anführungszeichen korrigieren. Das Schreiben einer korrekten Abfrage ist einfacher, schneller und sicherer. Warum vertuschen Sie eine * schlechte * Abfrage? –

Verwandte Themen