SQL 参数化列名

SQL Parameterised column names

我正在尝试创建参数化查询以从 table

检索数据

基本上我有一个 table 结构 ID nvarchar1 正文 日期时间1 日期时间 2

我正在尝试执行这样的查询,以便它选择当前日期大于 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 列表时,它们会自动分配给该类型的 table 列,所以这就是为什么我需要将列作为参数。

使用我认为应该可行的上述代码returns

消息 241,级别 16,状态 1,第 14 行 从字符串转换日期 and/or 时间时转换失败。

我做错了什么?

你很接近。我会为 table 构建 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;

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

编辑:

您不能使用参数替换列或 table 名称。我会把代码写成:

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()进行这种类型的操作,因为代码更容易理解和维护。

试试下面的方法。正如@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)