2017-04-19 81 views
0

我寫負責歸檔數據的應用程序,我們有一個數據庫表變量傳遞到SQL Server存儲過程,where子句

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

所以,當面對這種配置的配置,我應該歸檔所有MetricTime值在3天前的DeviceData表中的數據。

的原因,我此動態操作的方式是表名和列名不同(會有多行)

對於每個配置該存儲過程被稱爲

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 

和示例EXEC線

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

這導致:

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

因此,我在datetime2中傳遞的方式或我如何構成where子句的方式都是如此。

回答

0

替換此聲明:

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

通過

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

我特別不喜歡有到時間值轉換爲varchar值不過,也許有更好的方法來做到這一點( ?)。

相關問題