我正在尝试创建一个参数化查询,用于从表中检索数据
基本上我有一个表结构 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 从字符串转换日期和/或时间时转换失败。
我做错了什么?
答案 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)