【发布时间】:2021-02-25 00:45:26
【问题描述】:
我目前正在尝试使用 SSRS 通过 ODBC 运行红移报告。
我预计查询会在 SQL 有效时运行,但是看起来 SSRS 正在将参数名称传递回 SQL 查询,而不是像 id 期望的那样将参数值传递回 Redshift 请考虑以下查询。
SELECT x.Col_1, y.Col_2, x.Col_3, x.Col_4
From x_table as x
JOIN Y_table as y on x.Col_4 = y.Col_4
WHERE x.Col_4 = @Col_4
AND x.col_3 >= @From and x.col_3 < @To
AND x.col_2 >= @From and x.col_2 < @To
在 SSRS 中,当我尝试刷新字段列表时出现以下错误,
ERROR [42702] [Amazon][Amazon Redshift] (30) 尝试执行查询时出错:[SQLState 42702] 错误:列引用“From”不明确
此查询使用参数查询数据库以仅返回数据的子集,具体取决于特定客户和分类字段我无法将过滤器移出报告。
故障排除步骤
- 在 redshift 上运行此查询并删除参数时,它可以正常工作。
- 在带有参数的 SQL Server 上运行此查询时,它工作正常。
- 使用 ? 运行此查询时作为参数名称,它仅适用于第一个参数。
- 使用列定义以外的参数运行此查询时,它仍然会失败并出现类似错误
研究这似乎是 ODBC 数据源的一个常见问题,但在不使用多个参数的情况下,大多数人似乎只使用 ?但这只适用于单个参数。
我发现了两个类似的堆栈溢出,但都没有帮助我解决这个变化。
我怀疑 ODBC 数据集需要某种转义或类似的形式,以便 SSRS 可以将参数名称替换为值,但我无法在任何地方找到此文档,因为如果使用 ?由于参数名称有效,那么肯定只是使用某种转义的问题。
【问题讨论】:
-
您应该能够使用 ? 对多个参数进行转义,并且它们将按照从报告中填充参数的相同顺序填充。例如:如果您有
Where x.Col_4 = @Col_4 and x.col_3 = @Col_3,则将其替换为Where x.col_3 = ? AND x.Col_4 = ?,如果@col_3 在@col_4 之前填充。这对你来说不成功吗? -
它不起作用,因为在实际查询中我需要多次引用参数以进行日期时间查找
-
我已经针对该案例修改了示例 SQL
-
啊,在这种情况下,您可以在 SELECT 语句之前抛出一个
DECLARE @from DATETIME = ?吗?我在 SSIS 和 SSRS 中都这样做了,以便在 Select 本身之前操作参数。这将使您能够以正确的顺序保留参数,并且 ODBC 不会尝试从参数输入中解析 @col_3,但希望能够处理您为它明确布置的 @from。 -
调用列或变量'From'是自找麻烦!
标签: sql sql-server reporting-services odbc amazon-redshift