2017-04-19 9 views
0

ich verantwortlich, eine Anwendung schreibe für die Archivierung von Daten und wir haben die Konfiguration in einer DatenbanktabellePassing in Variablen zu SQL Server gespeicherte Prozedur, wo Klausel

Id | TableName | ColumnName | RetentionAmountInDays 
1  | DeviceData | MetricTime | 3 

Also, wenn mit dieser Konfiguration konfrontiert, ich alle archivieren sollte Daten in der DeviceData-Tabelle, in der der MetricTime-Wert vor 3 Tagen liegt.

Der Grund, warum ich diese dynamisch tue, ist die Tabellennamen und Spaltennamen unterscheiden

Für jede Konfiguration (es mehrere Zeilen sein würde) diese gespeicherte Prozedur

CREATE PROCEDURE GetDynamicDataForArchive 
    @TableName nvarchar(100), 
    @ColumnName nvarchar(100), 
    @OlderThanDate datetime2(7) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql nvarchar(1000); 
    SET @sql = 'SELECT * FROM ' + @TableName + ' WHERE ' + @ColumnName + ' < @OlderThanDate'; 
    exec sp_executesql @sql; 
END 

und ein Beispiel exec Linie genannt wird,

exec dbo.GetDynamicDataForArchive 'DeviceData', 'MetricTime', '2017-04-16 20:29:29.647' 

Daraus ergibt sich:

Conversion failed when converting date and/or time from character string. 

Es ist also etwas los mit dem, wie ich die datetime2 übergebe oder wie ich die where-Klausel formiere.

Antwort

0

Ersetzen Sie diese Aussage:

SET @sql = 'SELECT * FROM ' + @TableName + ' WHERE ' + @ColumnName + ' < @OlderThanDate' 

von

SET @sql = 'SELECT * FROM ' + @TableName + ' WHERE [' + @ColumnName + '] < ''' + cast(@OlderThanDate as varchar(23)) + ''''; 

ich nicht besonders mag, die die Datetime zu einem varchar Wert, da vielleicht obwohl zu konvertieren ist ein besserer Weg, dies zu tun (?).

Verwandte Themen