【问题标题】:How can I modify a MySQL query to work in Report Builder 3.0?如何修改 MySQL 查询以在 Report Builder 3.0 中工作?
【发布时间】:2017-05-22 17:05:35
【问题描述】:

我必须在 Report Builder 3.0 中编写将在 MySQL DB 上运行的 SQL 查询。我还将 3 个参数传递给此查询,其中一个参数将是列名。查询结构如下:

SELECT
  column1
  ,column21
  ,column15
  ,column6
  ,column9
  ,column2
  ,column19
FROM
  table_name
WHERE
  column1 LIKE @var_1 --@var_1 is a string
  AND column21 LIKE @var_2 --@var_1 is a string
  AND (@column is null OR @column = '' OR @column = 'N/A' OR @column = 'Unknown');--value in @column is an existing column name from table table_name

我有一个可以在 MySQL 工作台上执行我想要的操作的 SQL:

SET @var_1 = 'string1';
SET @var_2 = 'string2';
SET @columnName = 'string3';

SET @sql = CONCAT('SELECT
  column1
  ,column21
  ,column15
  ,column6
  ,column9
  ,column2
  ,column19
FROM
  table_name
WHERE
  column1 LIKE @var_1
  AND column21 LIKE @var_2
  AND (', @columnName ,' is null OR ', @columnName ,' = \'\' OR ', @columnName ,' = \'N/A\' OR ', @columnName ,' = \'Unknown\')');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

但我的问题是:如何在 Report Builder 3.0 的查询设计器中编写此代码? 我尝试了类似在报表生成器中遵循 SQL 的方法,它与工作查询在同一行上有所不同:

SET @SQL = CONCAT('SELECT
  column1
  ,column21
  ,column15
  ,column6
  ,column9
  ,column2
  ,column19
FROM
  table_name
WHERE
  column1 LIKE ''%' + @var_1 + '%''
  AND column21 LIKE ''%' + @var_2 + '%''
  AND (', @column ,' is null OR ', @column ,' = \'\' OR ', @column ,' = \'N/A\' OR ', @column ,' = \'Unknown\')');

PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

但我不断收到错误:

执行查询时出错。

ERROR [42000] [MySQL][ODBC 5.3(w) Driver][mysqld-5.1.73]您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'PREPARE stmt FROM @SQL;

附近使用正确的语法

执行语句;

第 3 行的 DEALLOCATE PREPARE stmt'(Microsoft SQL Server 报表生成器)

如何使用正确的语法编写此 SQL 以便它在报表生成器中工作?

【问题讨论】:

  • 无论您使用什么工具来执行它,您都必须编写它以使其具有正确的 SQL 语法。第一条线索:你永远不会关闭 CONCAT 函数上的 ()。
  • 感谢您指出这一点。我在未知之后添加了一个右括号。此外,我还添加了从 MySQL 工作台运行时按预期获取数据的工作 SQL。但是从报表生成器的查询设计器运行相同查询的问题是它没有提示@var_1@var_2,所以我必须更新查询,以便它提示所有三个变量。毕竟,从 Report Builder 尝试查询时仍然会给出相同的错误。
  • 使用更新后的代码编辑您的答案。此外,您可能会尝试在准备之前查看 @SQL 包含的内容。尝试自行执行,看看是否收到更具体的错误消息。
  • 我的问题中的第三个 SQL 是我通过 Report Builder 尝试的。它在“所以,我尝试过类似 SQL 的操作,它与工作查询在同一行上有所不同:”根据您的建议,尝试在不使用 prepare 的情况下执行 @SQL,并得到相同的错误,但对于“EXECUTE @SQL”。错误是ERROR [42000] [MySQL][ODBC 5.3(w) Driver][mysqld-5.1.73]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXECUTE @SQL' at line 3 (Microsoft SQL Server Report Builder) 试过SELECT @SQL 但同样的错误。
  • 我不是说要执行@SQL,而是要显示它,这样您就可以看到您准备和执行的语句中的语法错误在哪里。看不到 SQL 语句时很难调试它。

标签: mysql sql ssrs-2012 reportbuilder3.0


【解决方案1】:

我认为您不需要在报表生成器的查询设计器中准备和执行查询。根据您在数据源中指定的数据库类型,您只需编写查询,报表生成器将处理执行。

所以只需在查询设计器中输入:

SELECT
  column1
  ,column21
  ,column15
  ,column6
  ,column9
  ,column2
  ,column19
FROM
  table_name
WHERE
  column1 LIKE ''%' + @var_1 + '%''
  AND column21 LIKE ''%' + @var_2 + '%''
  AND (', @column ,' is null OR ', @column ,' = \'\' OR ', @column ,' = \'N/A\' OR ', @column ,' = \'Unknown\')'

或者,您是否尝试过通过单击查询文本框底部的“查询设计器”按钮来构建查询?这样,您可以指定从哪个表中获取数据,而无需键入 SQL 查询并冒着命名或语法错误的风险。

【讨论】:

  • 感谢您的建议。我尝试在删除 CONCAT、PREPARE 和 EXECUTE 后只运行查询,但随后它给出了语法错误。原因是转义字符和其他用于 CONCAT 的语法。所以我删除了所有额外的语法并运行了简单的查询,但它没有提取任何记录。如果我通过用它们的值替换 3 个变量直接在 MySQL DB 上运行相同的查询,它确实会获取记录。行为的不同是因为第三个变量@column 是列名。当报表生成器替换它时,它会在它周围加上引号,认为它是一个字符串。它是列名。
  • 这就是我尝试使用动态查询的原因,因为其中一个参数实际上是列名。我认为报表生成器与PREPARE...EXECUTE....DEALLOCATE 或仅EXECUTE 不兼容。我猜这是因为无论我如何更改报表生成器中的查询,它总是在 SET @SQL =CONCAT('....@column ,' = \'Unknown\')'); 之后的第一行给出错误
  • 您是否正在尝试编辑数据集的 sql 查询?如果是这样,您可以在左侧的“参数”选项卡中更改查询参数的值。我认为您不能在查询本身中设置参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多