判断一个字符串中有几个sql语句。
比如"  select * from test select * from tempproduct"再这个字符串中有两个查询语句。
语言不限,最好是C#,思路也行。

解决方案 »

  1.   

    不需要那高的技巧, 来点简单粗暴快速有效的。直接执行看能得到 DataSet 中有几个 Table 就可以了。
    但为了避免大的查询产生消耗, 限定 所有查询 只允许 输出一行。using System;
    using System.Data;
    using System.Data.SqlClient;namespace ConsoleApp2
    {
        class Program
        {
            static string connString = @"Data Source=.\sqlserver2014;Initial Catalog=tempdb;Integrated Security=True";
            static void Main(string[] args)
            {
                string sql = "select 1 select 2 select 3";
                int selectsNum = GetSelectsNum(sql);
                Console.WriteLine("Select Num:{0}", selectsNum);            Console.Read();
            }        private static int GetSelectsNum(string sql)
            {
                int r = 0;
                try
                {
                    //既然只是获取 Select 的数量,那就可以限定只输出一行,提高效率
                    sql += "SET ROWCOUNT 1; ";
                    using (SqlConnection conn = new SqlConnection(connString))
                    {
                        conn.Open();
                        SqlCommand cmd = new SqlCommand(sql, conn);
                        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                        DataSet ds = new DataSet();
                        adapter.Fill(ds);
                        r = ds.Tables.Count;
                    }
                }
                catch (Exception ex)
                {
                    r = -1;
                    Console.WriteLine("Exception: {0}", ex.Message);
                }
                return r;
            }
        }
    }
      

  2.   

    还有一种办法, 就是你去研究一下 SQL Server 的 smo , 引用相关的 dll , 然后获取相应的结果。
    理论上来说, 只要 SSMS (  , 官方客户端) 能执行的操作, 都是可以通过编程来实现的。 
    比方说现在有 3 个查询, 点一下下图的图标, 就能快速显示 估计的执行计划, 不需要真正执行。
    当然,对你的需求来说, 执行计划是什么内容并不重要, 关键是查到有几个执行计划就可以了。
    这个的优势还是比较明显, 我在 #4 的办法对于行数很少, 但有那种聚合函数的, 就没办法快起来。
    smo 这一块, 以前只弄过 创建数据库对象 脚本。 目前也没有专门的教程写这个, 但一定能实现你的需求。
    给个方向, 你自己先探索一下吧。
      

  3.   

    #4 的代码: Line 25 错了, 改成 sql = "SET ROWCOUNT 1 ; " + sql;
      

  4.   

    要查询什么样的sql语句?如果光是select直接看多少select,如果alter这样的语句也算,那就得有具体规则了
      

  5.   

    楼主说的应该是 有几个查询语句, 看 select 个数的话, 包含子查询就会有问题了。
      

  6.   

    楼主说的应该是 有几个查询语句, 看 select 个数的话, 包含子查询就会有问题了。
    恩确实不是很严谨,具体还得看楼主语句的情况,如果没有子查询能用这种直接看select的或者子查询写的也比较规范的就是(select count(*1) ...)也可以想法去掉得到select数量,这种就是比较简单快。当然还是得具体看楼主语句啥样,如果楼主语句很复杂不适合这种简单的判断,就得想别的方法了
      

  7.   

    这个功能应该是无法实现的,你不可能是实现所有关系型数据库的解析过程,就算单种数据库,比如sqlserver,就个人开发而言也无法做到
      

  8.   

    这个要先看你的语言定义,我记得标准的 SQL,一个 SQL 语句是需要 ; 结尾的。MSSQL 做了简化,可以省略 ;号,但我记得是需要换行的。明确了定义,就可以编写相应的解析器,但是一般来说,弄明白语言定义所花的时间比编写解析器更多。
      

  9.   

    用;来判断,
    所以你的语句也应该修改成 select * from tab1;select * from tab2;