首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个SQL语句拆分为单个SQL语句

将多个SQL语句拆分为单个SQL语句
EN

Stack Overflow用户
提问于 2009-03-11 01:43:43
回答 9查看 7.6K关注 0票数 4

说明:我希望有一个库或例程来做这件事,但我还没有找到这样的东西。我真的在寻找方向和建议从哪里开始..。

情况如下:我的SQL命令块以纯文本的形式出现。可能是一个SQL命令,也可能是多个SQL命令。我需要一种方法来拆分多个SQL命令,这样我就可以一次运行它们。确实有此行为。

我试图将此功能添加到运行在Apache (Debian)上的PHP5 5/MySQL5 5应用程序中。

重要的几点:

  1. 我确实需要一次运行它们。说真的,我不想要求用户在每条sub-selects
  2. Neatly语句之后输入分号。
  3. SQL语句可以在一行或多行上,因此我不能在至少支持选择、更新、插入、删除所需的LBs/CRs
  4. 上进行包装。它需要支持的
  5. ,它需要支持的查询是

选项卡式SQL需要工作h 113(为了可用的软件利益),我不想强迫用户输入任何类型的分隔符。H 214G 215

下面是SQL的一个示例块,我需要分成两个语句:

代码语言:javascript
复制
select sMessage, 
(
    SELECT COUNT(sTag) FROM Tags WHERE ixTicket = note.ixTicket
) FROM note
select * from ticket
    WHERE (SELECT MAX(nCount) FROM Counter WHERE ixTicket = ticket.ixTicket) > 5

我尝试了一些RegEx尝试,但这似乎不够强大。

对解决这一问题的方法有何建议?

EN

回答 9

Stack Overflow用户

发布于 2009-03-11 03:38:19

我一点也不确定这是否可能。您当然需要深入了解目标DBMS的SQL语法。例如,就在我的头上,这是一个MySQL语句:

代码语言:javascript
复制
INSERT INTO things
SELECT * FROM otherthings ON DUPLICATE KEY
UPDATE thingness=thingness+1

在一些DBMS中,可能存在一些没有分隔符的构造,可能是不明确的。

我不想要求用户在每个SQL语句之后输入分号。

我想你可能是被迫的。这完全是分隔SQL语句的标准方法。即使你能找到一种启发式的方法来检测可能是SQL语句的起始点,你也会冒着灾难的风险,比如意外的“从事物中删除”--没有地方--子句。

SQL语句可以放在一行或多行上,所以我不能对LBs/CRs进行包装。

双线换新语句可以接受吗?

--我尝试了一些RegEx尝试,但似乎还不够强大。

不,即使使用分号分隔符,regex也远远不够强大到可以解析SQL。问题点包括:

代码语言:javascript
复制
';'
";"
`;`
'\';'
''';'
-- ;
#;
/*;*/

以及这些结构的任何干涉。哇!

票数 3
EN

Stack Overflow用户

发布于 2009-03-11 01:50:29

试试这个图书馆。我过去曾成功地使用它来解析sql。http://www.sqlparser.com/

票数 1
EN

Stack Overflow用户

发布于 2009-03-11 04:36:16

为定期引起问题的讨论增添一种怪癖:

代码语言:javascript
复制
DECLARE c CURSOR FOR
    SELECT * FROM SomeWhere ...
        FOR UPDATE

尾随的更新往往会使临时解析器步履蹒跚。很可能您不必担心这一点,因为声明表示法(实际上是嵌入式SQL,而不是普通SQL)一开始是不允许的。但是FOR UPDATE子句可以出现在SQL的某些方言中,即使不是在DECLARE语句中也是如此,所以要小心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/633014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档