是否有将SQL查询编码为XML的标准方法?我的意思是
select name from users where name like 'P%' group by name order by name desc
可能编码为(我的5分钟模型,可能是线轴)......
<?xml version="1.0" encoding="UTF-8"?>
<query>
<select>
<table name="users">
<column name="name"/>
</table>
</select>
<from>
<table name="users"/>
</from>
<where>
<operator name="like">
<column name="name"/>
<value>P%</value>
</operator>
</where>
<aggregation>
<groupby>
<column name="name"/>
</groupby>
</aggregation>
<order>
<order-by>
<column name="name" order="desc"/>
</order-by>
</order>
</query>
...这样可以轻松构建,存储,验证结构和内容(通过基于数据库模式生成模式)等。
答案 0 :(得分:5)
我不知道任何这样的标准。你到目前为止看起来很可行。我问你为什么要这样做。我认为这是一个内部平台(反模式)。此外,它还特别重新发明了SQL,这是反模式的一个众所周知的例子。最重要的是,它是用XML编程的,这被广泛认为是一个坏主意。
SQL语法非常简单,您可以使用普通的解析器生成器工具在短时间内为它构建解析器(Web上可能存在一些开源的)。这将是一种更清晰的验证SQL语法的方法。
答案 1 :(得分:2)
我一直在尝试做同样的事情。
在评论中回答我为什么要这样做的问题。好吧,我想用一组可用列和过滤条件定义一个基本查询,我想让用户选择他们想要显示的列,并启用和禁用where子句中的某些表达式。
我已经玩了一些XML模式的变体并得到了一些不错的结果。我甚至能够根据用户的偏好应用XSLT来提取SQL文本。
我也一直在寻找SQL解析器。 http://www.sqlparser.com有一个,但它的商业版本和它的API是严格的德尔福风格,在我看来不太容易访问。
正如其他人所说,使用像ANTLR这样的东西来生成将解析SQL的C#代码是可行的。您可以找到一些SQL语法here。最近列出的MS SQL Gramar是MS SQL 2000.我没有时间玩这个东西。
我希望在Oslo SDK中有一个可以解析查询的M Grammer,但我还没有找到。
答案 2 :(得分:1)
没有一个标准。可能你不应该做你想做的事。但如果我要去,我会看一个: (1)对xml查询计划中的一些构造进行标准化。默认sql 2005安装上的XSD位于C:\ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Binn \ schemas \ sqlserver \ 2004 \ 07 \ showplan \ showplanxml.xsd
(2)Sql 2008在IDE中附带了intellisense,它似乎是在这个.net程序集的帮助下实现的 - C:\ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.SqlParser.dll 如果添加对此程序集的引用,则可以解析源脚本并提取解析器程序集提供的xml定义。 E.g。
SqlScript script = Parser.Parse(strSqlScript);
foreach (SqlBatch batch in script.Batches)
{
foreach (SqlStatement s in batch.Statements)
{
Console.Write(s.Xml);
}
}
您可能会发现它提供的xml定义可以根据您的需要重复使用。
答案 3 :(得分:1)
XQuery是一种XML查询语言,支持与SQL相同的一些想法。这些不是可以理解的语言,但是如果你熟悉SQL,你也不应该对XQuery太麻烦。
据我所知,XQuery只有一个实际的实现,exist。
除了一般的探索性兴趣外,我还没有使用过这两种技术。
答案 4 :(得分:0)
好吧,我只是在思考这个问题,试图记住它是如何为CRM做的,它在定义实体时动态构建表。
然后我在几分钟前偶然发现了正确的名字“fetchXML”
http://msdn.microsoft.com/en-us/library/gg328117.aspx
当然这是MS的所有者,但至少你可以肯定他们已经涵盖了任何可能的情况。