我正在编写一个负责归档数据的应用程序,我们在数据库表中进行了配置
Id | TableName | ColumnName | RetentionAmountInDays
1 | DeviceData | MetricTime | 3
因此,当面对此配置时,我应该存档DeviceData表中MetricTime值在3天前的所有数据。
我动态执行此操作的原因是表名和列名不同(会有多行)
对于每个配置,此存储过程称为
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 :(得分:0)
替换此声明:
SET @sql = 'SELECT * FROM ' + @TableName + ' WHERE ' + @ColumnName + ' < @OlderThanDate'
通过
SET @sql = 'SELECT * FROM ' + @TableName + ' WHERE [' + @ColumnName + '] < ''' + cast(@OlderThanDate as varchar(23)) + '''';
我并不特别喜欢将日期时间转换为varchar值,但也许有更好的方法(?)。