有没有一种简洁的方法来读取嵌入式SQL资源文件?

3
为了避免在类中创建SQL语句字符串,我将它们作为.sql文件放置在同一包中,并在静态构造函数中将内容读入字符串。原因是由于SQL正在查询的ERP系统非常复杂,所以SQL本身也很复杂。
这种方法没有问题,但是由于SQL读取机制只是简单地读取整个文件,因此如果该文件中有任何注释位于行末,那么读取可能会失败,因为首先会删除多余的空格和换行符。全注释行(即以“--”开头的行)将被删除。
我可以改进简单的读取方法来读取文件并删除注释行等,但我不得不想知道是否已经有可用于读取SQL文件并清理其内容的工具。

有点类似:https://dev59.com/Q3RB5IYBdhLWcg3wUVxd - zeller
4
为什么一定要清理东西呢?我看到删除换行符会破坏你的注释,但是为什么不直接将查询原样传递给数据库引擎呢?这样,您甚至可以在错误信息中获得有意义的行号。 - MvG
这是一个很好的观点MvG,尽管一些格式化后的SQL语句非常大,在某些情况下超过100行,并且由于left join中的case语句和嵌套的select语句而有大量空格,因此可以通过整理来节省很多空间。我们的RDBMS(OpenEdge)在错误中也不提供行号,并且实际上包括所有没有换行符的空格,使得识别错误更加困难。但是您的观点对于其他情况仍然是有效的。 - Brett Ryan
为什么不使用存储过程来存储你的 SQL,而不是将它们存储为 .sql 文件呢?这样可以提高查询性能,而且你也不必费心将文本文件解析到你的类中。在我看来,这是双赢的局面。 - GarethD
  1. 注释字符(--)可以出现在行的任何位置,因此如果您想清除这些内容,最好使用某种正则表达式。
  2. 您需要处理多行注释(/* */)吗?
  3. 虽然这通常是一种非常容易出错的方法(字符串操作很难正确执行),但您可能希望在执行之前通过使用SET NOEXEC ON来验证更改。
- saarp
显示剩余2条评论
1个回答

0

我在一个项目中看到了同样的问题,通过将查询存储在XML中,并在运行时将XML加载到自定义StoredQueriesCache对象中来解决。 要获取查询,我们将调用StoredQueriesCache对象上的方法,只需传递查询名称(在XML中定义),它就会返回查询。

编写这样的东西相当简单。 XML将类似于以下内容...

<Query>
  <Name>SomeUniqueQueryName</Name>
  <SQL>
    SELECT someColumn FROM someTable WHERE somePredicate
  </SQL>
</Query>

每个存储的查询都应该有一个元素。XML文件将在应用程序启动时从文件中加载到内存中,或者根据您的需要可以从文件中进行延迟加载。然后,持有XML的StoredQueriesCache对象将具有按名称返回单个查询的方法。在我的经验中,由于换行符是XML节点的innertext的一部分,因此在查询中添加注释从未引起任何问题,但如果您希望检索查询的StoredQueriesCache方法可以解析注释。

我发现这是一种最有组织的存储查询的方式,既不嵌入代码,也不使用存储过程。实际上应该有一个库为您完成这项工作;也许我会写一个!


不错的想法,但你失去了IDE验证SQL和防止在隔离测试中执行查询的能力。我目前只是在项目中使用嵌入式SQL资源文件,这个方法还可以。当加载资源文件时,我会删除行注释,但如果注释在行末,则无法正常工作。然后我会删除换行符,因为我们的SQL引擎(OpenEdge)在存在换行符时无法正确报告错误。 - Brett Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接