2016-04-20 5 views
0

Ich versuche, eine parametrisierte Abfrage zu erstellen, für die Daten wieder aus einer TabelleSQL Parametriertes Spaltennamen

Wesentlichen eine Tabellenstruktur von ID Abrufen Ich habe nvarchar1 ntext- datetime1 datetime2

und ich bin versuchen, eine Abfrage so zu tun, dass sie alle Daten auswählt, bei denen das aktuelle Datum größer als datetime1 und kleiner als datetime2 ist

SELECT 
    ID, nvarchar1, 
    ntext, 
    datetime1, 
    datetime2 
FROM 
    TABLEName 
WHERE 
    datetime1 >= @CurrentDate 
    AND datetime2 <= @CurrentDate 

Ich möchte die Spalten Parameter wie @TableName, @CurrentDate, @StartDate, @EndDate

DECLARE @TableName NVARCHAR(100); 
SET @TableName = '[Surveys].[dbo].[Table]' 

DECLARE @CurrentDate DateTime; 
SET @CurrentDate = GETDATE(); 

DECLARE @StartDate NVARCHAR(100); 
SET @StartDate = 'datetime1' 

DECLARE @EndDate NVARCHAR(100); 
SET @EndDate = 'datetime2' 

DECLARE @sql nvarchar(1000) 
SET @sql = 'SELECT * FROM ' + @TableName + 'WHERE' + @EndDate + '>=' + @CurrentDate + 'AND' + @StartDatedatetime1 + '<=' + @CurrentDate 
EXEC(@sql) 

Die Daten geht zu kommen von einer SP-Datenquelle machen, so habe ich keine Kontrolle über die Spalte Namen etc. und wenn ich die SP-Listen erstelle, ordnen sie automatisch einer Tabellenspalte dieses Typs zu, deshalb brauche ich Spalten, um Parameter zu sein.

den obigen Code verwenden, die ich dachte, sollte 241 kehrt

Msg arbeiten, Ebene 16, Status 1, Zeile 14 Fehler bei der Konvertierung, wenn Datum Umwandlung und/oder Zeit aus Zeichenkette.

Was mache ich falsch?

+2

Also, was ist Ihre Frage? – MusicLovingIndianGirl

+0

Sie sollten für die Variablen vom Typ datetime keine Anführungszeichen benötigen. ICBW. –

Antwort

2

Versuchen Sie Folgendes. Wie @GordonLinoff sagte, fehlten die einfachen Anführungszeichen (') aus der Variablen @CurrentDate. Sie haben auch einen Parameter an die @sql Variable übergeben, die ein NVARCHAR Datentyp ist. Diese werden nicht implizit konvertiert, so dass die @CurrentDate variablen Anforderungen an einen NVARCHAR konvertiert werden:

DECLARE @sql nvarchar(1000) 
SET @sql = 'SELECT * FROM ' + @TableName 
    + ' WHERE ' + @EndDate + ' >= ''' + CONVERT(NVARCHAR(50), @CurrentDate,120) 
    + ''' AND ' + @StartDate + ' <= ''' + CONVERT(NVARCHAR(50), @CurrentDate,120) + '''' 


EXEC(@sql) 
+1

Wenn du Gordons Antwort ansiehst, siehst du, dass der Parameter ohne Konvertierung übergeben wird und im Text der Abfrage ohne Anführungszeichen angegeben wird ... Die Verwendung von Parametern soll ** buchstäblich gegebene Werte in der Abfrage vermeiden **. Zweitens: Insbesondere wenn es um Datetime-Werte geht, sollte man Konvertierungen vermeiden, wenn dies überhaupt möglich ist (falls nicht zu vermeiden, bevorzugen Sie "126"). – Shnugo

+0

Das Ergebnis davon ist eine Spalte unbenannt mit dem Wert ---- SELECT * FROM [Umfragen]. [Dbo]. [Z_TEST] WHERE datetime2> = '2016-04-20 13:24:25' UND datetime1 <= '2016-04-20 13:24:25' ----- Scheint es kommt näher, aber nicht ganz da? – KlydeMonroe

+0

Sollte die CurrentDate-Variable als DateTime festgelegt werden und sollten StartDate und EndDate DateTime sein oder sollten sie Nvarchar sein und in der Select-Anweisung konvertiert werden? – KlydeMonroe

2

Sie sind ziemlich nah. Ich würde die SQL für die Tabelle erstellen und dann Parameter verwenden, für das aktuelle Datum: Das ist etwas so sein würde:

SET @sql = ' 
SELECT * 
FROM @TableName 
WHERE datetime2 >= @CurrentDate AND datetime1 <= @CurrentDate'; 

SET @sql = REPLACE(@sql, '@TableName', @TableName); 

exec sp_executesql @sql, N'@CurrentDate date', @CurrentDate = @CurrentDate; 

übrigens das Problem mit Ihrer Anfrage ist der Mangel an einfachen Anführungszeichen um die Datumskonstanten.

EDIT:

Sie können nicht Spalte oder Tabellennamen mit Hilfe von Parametern ersetzen. Ich würde den Code schreiben als:

SET @sql = ' 
SELECT * 
FROM @TableName 
WHERE @datetime2 >= @CurrentDate AND @datetime1 <= @CurrentDate'; 

SET @sql = REPLACE(@sql, '@TableName', @TableName); 
SET @sql = REPLACE(@sql, '@datetime1', @DateTime1); 
SET @sql = REPLACE(@sql, '@datetime2', '@DateTime2); 

. . .

Ich verwende REPLACE() für diese Art von Operation, weil der Code leichter zu verstehen und zu pflegen ist.

+0

Ich bin mir nicht sicher, ich verstehe ... Ich habe es funktioniert wie folgt ... DECLARE @ CurrentDate DateTime; SET @ CurrentDate = GETDATE(); SELECT Top 1000 [ID] , [nvarchar1] , [ntext2] , [datetime1] [datetime2] FROM [Surveys]. [DBO].[z_TEST] WHERE datetime2> = @ CurrentDate AND datetime1 <= @ CurrentDate Aber sobald ich versuche, datetime1 und datetime2 in params zu konvertieren, scheitert es - Leerzeichen in der Variable intentional für kommentieren – KlydeMonroe

Verwandte Themen