标签: sql-parser

如何在Node.js中解析/标记化SQL语句

我正在寻找一种在Node.js应用程序中解析/标记SQL语句的方法,以便:

  • ISO/IEC 9075标准或此处定义的所有"基础"SQL关键字进行标记.
  • 验证SQL语法.
  • 找出查询将要做什么(例如读或写?).

你有任何解决方案或建议偷看?

链接:任何Javascript/Jquery库验证SQL语句?


我做过研究,发现了一些方法:

使用现有的node.js库

我进行了谷歌搜索,但没有找到一个可以使用的自愿和流行的图书馆.我找到了那些:

不幸的是,这些库中没有一个是完整和可靠的.

基于node.js低级标记化库自己完成

我可以使用低级标记器库来完成自己的工作,例如:

基于现有的Javascript代码美化自己做

CodeMirror是一个非常酷的Javascript库(浏览器端),可以识别SQL关键字,字符串等.检查演示.

我可以基于CodeMirror构建一个node.js库标记器.在SQL模式是这里github上,我也许可以适应它到节点的应用程序中获得令牌.

PS:CodeMirrorgithub上有5,046颗星,维护得很好.


我发现存在2个不同的问题:标记化和语法验证(与标记化有关).

我根据优秀的CodeMirrorSQL模式(github上的5,046颗星,维护得很好)使自己成为Node.js 的SQL标记 …

sql parsing tokenize node.js sql-parser

18
推荐指数
1
解决办法
1万
查看次数

用于Python的SQL解析库

我们需要一个SQL解析或分解Python的库.我们希望能够输入SQL文本查询,然后将查询部分作为结果返回.它不需要花哨或任何东西,但我们希望避免自己进行解析.理想情况下,我们可以做以下事情:

the_query = "select something from some_table where blah = 'thing' limit 15"
query_parts = the_library.parse(the_query)
print query_parts.limit().val()

>>> '15'
Run Code Online (Sandbox Code Playgroud)

这也是:

the_query = "select something from some_table where blah = 'thing'"
query_parts = the_library.parse(the_query)
print query_parts.limit().val()

>>> None
Run Code Online (Sandbox Code Playgroud)

任何人都可以给我们任何指示吗?如果功能更有限,那也没关系.

非常感谢!

python sql parsing sql-parser

10
推荐指数
1
解决办法
7651
查看次数

如何使用JSQLPARSE从SQl检索表名和列名

我是第一次使用JSQLPARSER.我有一些动态的SQL文件,我需要从该SQL读取表和列名称.经过大量谷歌搜索后,我尝试使用JSQLPARSER.我试图从文件中读取列名,但由于表达式,我无法读取列名,请问任何人在我出错的地方纠正我的代码.我正在获取CLASSCASTEXCEPTION代码:

public static void main(String[] args) throws JSQLParserException
    {
        // TODO Auto-generated method stub
         String statement="SELECT LOCATION_D.REGION_NAME, LOCATION_D.AREA_NAME, COUNT(DISTINCT INCIDENT_FACT.TICKET_ID) FROM LOCATION_D, INCIDENT_FACT WHERE ( LOCATION_D.LOCATION_SK=INCIDENT_FACT.LOCATION_SK ) GROUP BY LOCATION_D.REGION_NAME, LOCATION_D.AREA_NAME"; 
         CCJSqlParserManager parserManager = new CCJSqlParserManager();
         Select select=(Select) parserManager.parse(new StringReader(statement));

         PlainSelect plain=(PlainSelect)select.getSelectBody();     
         List selectitems=plain.getSelectItems();
         System.out.println(selectitems.size());
         for(int i=0;i<selectitems.size();i++)
         {
            Expression expression=((SelectExpressionItem) selectitems.get(i)).getExpression();  
            System.out.println("Expression:-"+expression);
            Column col=(Column)expression;
            System.out.println(col.getTable()+","+col.getColumnName());      
         }
    }
Run Code Online (Sandbox Code Playgroud)

java sql sql-parser jsqlparser

8
推荐指数
1
解决办法
5622
查看次数

将用户定义的函数添加到方解码

我需要为Calcite添加一个用户定义的函数,它将一个整数作为参数并返回一个整数.

    public class SquareFunction  {
        public int eval(int a) {
            return a*a;
        }
    }
Run Code Online (Sandbox Code Playgroud)

以及创建模式并添加函数的相关代码

     SchemaPlus rootSchema = Frameworks.createRootSchema(false);
     rootSchema.add("SQUARE_FUNC", 
                    ScalarFunctionImpl.create(SquareFunction.class,"eval"); 
Run Code Online (Sandbox Code Playgroud)

但是简单的SQL喜欢

select SQUARE_FUNC(1) from test;
Run Code Online (Sandbox Code Playgroud)

验证期间失败,并显示以下消息:

No match found for function signature SQUARE_FUNC(<NUMERIC>)
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪是:

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:463)
    at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:804)
    at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:789)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:4386)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.handleUnresolvedFunction(SqlValidatorImpl.java:1670)
    at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:278)
    at org.apache.calcite.sql.SqlFunction.deriveType(SqlFunction.java:223)
    at org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:4965)
    at org.apache.calcite.sql.validate.SqlValidatorImpl$DeriveTypeVisitor.visit(SqlValidatorImpl.java:1)
    at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:137)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.deriveTypeImpl(SqlValidatorImpl.java:1586)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.deriveType(SqlValidatorImpl.java:1571)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.expandSelectItem(SqlValidatorImpl.java:453)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelectList(SqlValidatorImpl.java:3668)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3186)
    at org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60)
    at org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84)
    at org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:937) …
Run Code Online (Sandbox Code Playgroud)

java sql-parser apache-calcite

7
推荐指数
1
解决办法
1690
查看次数

将SQL查询解析为类似DOM的树以启用自动排列?

我正在尝试调试大型而复杂的sql视图。视图中没有显示记录,我需要确定是哪个子句或联接导致记录现在显示。目前,我正在以一种非常手动的方式执行此操作,一次删除一个子句,然后运行查询以查看是否显示所需的行。

我认为如果能以编程方式执行此操作将非常好,因为我最终每两周就会陷入类似这样的查询中。


有人知道是否有一种方法可以将SQL查询解析为对象树(例如中的对象sqlalchemy.sql.expression),以便我能够对树进行透视并执行结果吗?

python sql sqlalchemy sql-parser

6
推荐指数
1
解决办法
2268
查看次数

可视化sql语句正在使用的内容

我有一个SQL语句,它使用通过另一组语句构建的几个表,而这些语句又由更多的语句集等构建到大约8度扇形到大约25个表(它在第4度中变得更宽但是那个级别最终开始指向同样的几个常见来源).

我正在为Graphviz制作一个点文件,它显示每个语句的选定列,以及每个列来自哪个表.由于涉及案例陈述和函数,有时每列有多个来源.一旦达到一定程度,它不仅有点混乱,而且难以正确读取或写入.

我一直试图找到是否有一个工具分析SQL select语句和(而不是制作一个执行计划图)图表,哪些插入到哪些出局.优选地,该工具能够将其与多层陈述相结合.

有谁知道这样的工具?

你看,在Google上搜索"graph an sql statement"等等,结果就是如何使用SQL查询中的数据或图形数据库特有的数据制作图表和图表.无论是在这里还是在那里,将"图形"改为"可视化"都没有帮助.

例如

SELECT CASE WHEN A.info IS NULL THEN 'Jam'
            WHEN B.inform LIKE 'N/A%' THEN 'Butter'
            WHEN A.info > 4 THEN 'Apricot'
            ELSE 'Organic'
       END AS information,
       -- More of the same
       FROM 2_KU_4_SKU AS A
       LEFT JOIN
       SKU_HOWS_ROC AS B
       ON A.fskuid = B.idfsk;
INSERT INTO 2_KU_4_SKU
       -- More case statements and other stuff but lets just say
       sku_id AS fskuid,
       short_sku_desc AS info
       FROM BASIC_SKU_TABLE_NOT_A_VIEW_TEDS_VERSION_LATEST_Q108;
INSERT INTO SKU_HOWS_ROC
       -- You …
Run Code Online (Sandbox Code Playgroud)

sql graphviz sql-parser

6
推荐指数
1
解决办法
523
查看次数

如何安装Microsoft.SqlServer.Management.SqlParser?

当我在新机器上重建它时,我的c#安装程序项目提出了很多警告。警告是类似的,他们正在寻找仅存在10.0.0.0版本的dll 11.0.0.0版本。我发现这是由于安装的SQL Server版本(SQL Server 2008 R2)引起的。大多数dll都是由于共享管理对象软件包的版本不是11.0.0.0而引起的。

因此,我安装了共享管理对象所需的SqlSysClrTypes.msi(x86)。然后,我安装了ShareManagementObjects.msi(x86)。我从这里得到的。

一些错误已经消失,但是现在我得到了2个,它们似乎引用了应该从SharedManagementObjects.msi安装的同一dll。它必须可以获取/安装了某些东西,因为我当前的版本为10.0.0.0。

错误是:

找不到程序集'Microsoft.SqlServer.Smo.dll'的依赖项'MICROSOFT.SQLSERVER.MANAGEMENT.SQLPARSER'(签名='89845DCD8080CC91'版本= '11 .0.0.0')

和:

找不到程序集'Microsoft.SqlServer.Management.SmoMetadataProvider.dll'的依赖项'MICROSOFT.SQLSERVER.MANAGEMENT.SQLPARSER'(签名='89845DCD8080CC91'Version = '11 .0.0.0')

我读过的所有内容都建议将Microsoft.sqlserver.management.sqlparser安装为SharedManagementObjects.msi的一部分。我可以做些什么来获取此dll吗?还有其他我需要安装的东西,例如Native Client?

c# dll sql-parser sql-server-2012

5
推荐指数
1
解决办法
3779
查看次数

存储过程解析器

我试图解析数百个存储过程来专门获取它们的输出变量"@FirstName",它们使用哪些表,以及它们从"MyTbl.FirstName"中提取哪些字段.我能够很容易地收集变量,但是我在收集表名时遇到了麻烦.有人可以帮忙吗?

到目前为止,我已经能够通过使用StreamReader解析SQL文件并逐行收集信息来提取大部分字段,例如,如果一行包含输出,那么我知道该行中的第一个文本很可能是@变量.

@Address1 varchar(45) output,
@Address2 varchar(45) output,
@City varchar(35) output,
@State varchar(2) output,
@Zip varchar(10) output
Run Code Online (Sandbox Code Playgroud)

从那里我可以将@Variable存储到字典中,如果任何行包含@Variable并且还包含'=',那么我知道我们对它所对应的字段有匹配.

@Address1 = c.Address,          
@Address2 = c.AddressSecondLine,
@City = c.City,
@State = c.State,
@Zip = c.ZipOrPostalCode
Run Code Online (Sandbox Code Playgroud)

现在我只是在收集表名时遇到问题.我可以轻松地解析字段名称中的表别名,但是我遇到了将别名与表名匹配的问题.有谁知道这样做的好方法?这是我到目前为止所尝试的内容:

FROM Table.dbo.SalesStuff ss
LEFT OUTER JOIN Table.dbo.Customer c ON ss.CustNo = c.CustNo
Left JOIN Table.dbo.Vending v on @tmpVin = v.vin
Run Code Online (Sandbox Code Playgroud)

码:

keyColl = tables.Keys;
foreach (string var in keyColl)
{
    if (line.Contains(" " + var + '\r') || line.Contains(" " + var + " ") || …
Run Code Online (Sandbox Code Playgroud)

c# stored-procedures sql-server-2005 text-parsing sql-parser

2
推荐指数
1
解决办法
1176
查看次数

Apache Calcite在SQL字符串中查找选定的列

我有一个用例,我想知道在SQL
SELECT name, age*5 as intelligence FROM bla WHERE bla=bla
字符串中选择的列,例如,如果SQL是这样的:那么在解析上面的String之后,我只希望输出是:name, intelligence
首先,是否可以通过方解石?
也欢迎任何其他选择。

PS:在实际在数据库上运行查询之前,我想知道这一点。

java sql-parser apache-calcite

1
推荐指数
1
解决办法
1813
查看次数

拆分字符串;

我已经检查了很多,但我无法理解它.

我需要将sql转储拆分为查询.

我需要什么基本上采取这样的字符串:

DROP TABLE IF EXISTS `GDN_Activity`;

CREATE TABLE `GDN_Activity` (
  `ActivityID` int(11) NOT NULL AUTO_INCREMENT,
  `ActivityTypeID` int(11) NOT NULL,
  `NotifyUserID` int(11) NOT NULL DEFAULT '0',
  `ActivityUserID` int(11) DEFAULT NULL,
  `RegardingUserID` int(11) DEFAULT NULL,
  `Photo` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `HeadlineFormat` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Story` text COLLATE utf8_unicode_ci,
  `Format` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Route` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `RecordType` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
  `RecordID` int(11) DEFAULT NULL,
  `InsertUserID` int(11) DEFAULT NULL,
  `DateInserted` datetime NOT …
Run Code Online (Sandbox Code Playgroud)

php mysql sql-parser

0
推荐指数
1
解决办法
129
查看次数

使用sqlparse解析CASE WHEN语句

我有以下SQL查询,并想使用解析 sqlparse

import sqlparse

query =  """
select SUM(case when(A.dt_unix<=86400
                     and B.flag="V") then 1
           end) as TEST_COLUMN_1,
       SUM(case when(A.Amt - B.Amt > 0
                     and B.Cat1 = "A"
                     and (B.Cat2 = "M"
                          or B.Cat3 = "C"
                          or B.Cat4 = "B")
                     and B.Cat5 is NULL) then 1
           end) as TEST_COLUMN_2
from test_table A
left join test_table_2 as B on A.ID=B.ID
where A.DT >B.DT
group by A.ID
"""

query_tokens = sqlparse.parse(query)[0].tokens
print(query_tokens)
Run Code Online (Sandbox Code Playgroud)

将给出SQL语句中包含的所有令牌:

[<Newline ' ' at 0x7FAA62BD9F48>, <DML 'select' at 0x7FAA62BE7288>, <Whitespace …
Run Code Online (Sandbox Code Playgroud)

python sql-parser

0
推荐指数
1
解决办法
379
查看次数