1

我正在编写一个负责归档数据的应用程序,我们在数据库表中有配置

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 子句的形成方式有所不同。

4

1 回答 1

2

替换此语句:

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

经过

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

不过,我并不特别喜欢将日期时间转换为 varchar 值,也许有更好的方法来做到这一点(?)。

于 2017-04-19T21:03:55.963 回答