说明:我希望有一个库或例程来做这件事,但我还没有找到这样的东西。我真的在寻找方向和建议从哪里开始..。
情况如下:我的SQL命令块以纯文本的形式出现。可能是一个SQL命令,也可能是多个SQL命令。我需要一种方法来拆分多个SQL命令,这样我就可以一次运行它们。确实有此行为。
我试图将此功能添加到运行在Apache (Debian)上的PHP5 5/MySQL5 5应用程序中。
重要的几点:
选项卡式SQL需要工作h 113(为了可用的软件利益),我不想强迫用户输入任何类型的分隔符。H 214G 215
下面是SQL的一个示例块,我需要分成两个语句:
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尝试,但这似乎不够强大。
对解决这一问题的方法有何建议?
发布于 2009-03-11 03:38:19
我一点也不确定这是否可能。您当然需要深入了解目标DBMS的SQL语法。例如,就在我的头上,这是一个MySQL语句:
INSERT INTO things
SELECT * FROM otherthings ON DUPLICATE KEY
UPDATE thingness=thingness+1在一些DBMS中,可能存在一些没有分隔符的构造,可能是不明确的。
我不想要求用户在每个SQL语句之后输入分号。
我想你可能是被迫的。这完全是分隔SQL语句的标准方法。即使你能找到一种启发式的方法来检测可能是SQL语句的起始点,你也会冒着灾难的风险,比如意外的“从事物中删除”--没有地方--子句。
SQL语句可以放在一行或多行上,所以我不能对LBs/CRs进行包装。
双线换新语句可以接受吗?
--我尝试了一些RegEx尝试,但似乎还不够强大。
不,即使使用分号分隔符,regex也远远不够强大到可以解析SQL。问题点包括:
';'
";"
`;`
'\';'
''';'
-- ;
#;
/*;*/以及这些结构的任何干涉。哇!
发布于 2009-03-11 01:50:29
试试这个图书馆。我过去曾成功地使用它来解析sql。http://www.sqlparser.com/
发布于 2009-03-11 04:36:16
为定期引起问题的讨论增添一种怪癖:
DECLARE c CURSOR FOR
SELECT * FROM SomeWhere ...
FOR UPDATE尾随的更新往往会使临时解析器步履蹒跚。很可能您不必担心这一点,因为声明表示法(实际上是嵌入式SQL,而不是普通SQL)一开始是不允许的。但是FOR UPDATE子句可以出现在SQL的某些方言中,即使不是在DECLARE语句中也是如此,所以要小心。
https://stackoverflow.com/questions/633014
复制相似问题