SQL参数化列名

时间:2016-04-20 11:02:27

标签: sql-server tsql variables dynamic-sql

我正在尝试创建一个参数化查询,用于从表中检索数据

基本上我有一个表结构 ID nvarchar1 NTEXT datetime1 datetime2

我正在尝试进行查询,以便选择当前日期大于datetime1且小于datetime2的所有数据

SELECT 
    ID, nvarchar1, 
    ntext, 
    datetime1, 
    datetime2 
FROM 
    TABLEName 
WHERE 
    datetime1 >= @CurrentDate 
    AND datetime2 <= @CurrentDate

我想制作列参数,例如 @TableName,@ CurrentDate,@ StartDate,@ EndDate

DECLARE @TableName NVARCHAR(100);
SET @TableName = '[Surveys].[dbo].[Table]'

DECLARE @CurrentDate DateTime;
SET @CurrentDate = GETDATE();

DECLARE @StartDate NVARCHAR(100);
SET @StartDate = 'datetime1'

DECLARE @EndDate NVARCHAR(100);
SET @EndDate = 'datetime2'

DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT * FROM ' + @TableName + 'WHERE' + @EndDate + '>=' + @CurrentDate + 'AND' +  @StartDatedatetime1 + '<=' + @CurrentDate
EXEC(@sql)

数据将来自SP数据源,因此我无法控制列名等。当我创建SP列表时,它们会自动分配给该类型的表列,这就是我需要的原因列是参数。

使用我认为应该工作的上述代码返回

Msg 241,Level 16,State 1,Line 14 从字符串转换日期和/或时间时转换失败。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

你非常接近。我将为表构造SQL,然后使用当前日期的参数:这将是这样的:

SET @sql = '
SELECT *
FROM @TableName
WHERE datetime2 >= @CurrentDate AND datetime1 <= @CurrentDate';

SET @sql = REPLACE(@sql, '@TableName', @TableName);

exec sp_executesql @sql, N'@CurrentDate date', @CurrentDate = @CurrentDate;

顺便提一下,查询的问题是日期常量周围缺少单引号。

编辑:

您不能使用参数替换列名或表名。我会将代码编写为:

SET @sql = '
SELECT *
FROM @TableName
WHERE @datetime2 >= @CurrentDate AND @datetime1 <= @CurrentDate';

SET @sql = REPLACE(@sql, '@TableName', @TableName);
SET @sql = REPLACE(@sql, '@datetime1', @DateTime1);
SET @sql = REPLACE(@sql, '@datetime2', '@DateTime2);

。 。

我使用REPLACE()进行此类操作,因为代码更易于理解和维护。

答案 1 :(得分:2)

尝试以下方法。正如@GordonLinoff所说,你在'变量周围缺少单引号(@CurrentDate)。此外,您将DATETIME参数传递给@sql变量,即NVARCHAR数据类型。这些不是隐式转换的,因此@CurrentDate变量需要首先转换为NVARCHAR

DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT * FROM ' + @TableName 
    + ' WHERE ' + @EndDate + ' >= ''' + CONVERT(NVARCHAR(50), @CurrentDate,120) 
    + ''' AND ' +  @StartDate + ' <= ''' + CONVERT(NVARCHAR(50), @CurrentDate,120) + ''''


EXEC(@sql)