将变量传递给SQL Server存储过程where子句

时间:2017-04-19 20:58:57

标签: stored-procedures datetime2

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

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子句的。

1 个答案:

答案 0 :(得分:0)

替换此声明:

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

通过

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

我并不特别喜欢将日期时间转换为varchar值,但也许有更好的方法(?)。