我正在编写一个负责归档数据的应用程序,我们在数据库表中有配置
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 子句的形成方式有所不同。