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)
我正在尝试创建参数化查询以从 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)