有没有办法在SQL Server CE中一次搜索所有表的字段?

时间:2013-03-04 20:13:47

标签: c# sql-server-ce webmatrix

我希望在WebMatrix(C#.net)环境(使用SQL Server Compact)中,有一种方法可以在所有表​​和字段中搜索值。我有一堆(如100)表,通过WebMatrix连接,我正在寻找一个包含我需要的信息的表。

我来过这里:http://blogs.thesitedoctor.co.uk/tim/2007/11/02/How+To+Search+Every+Table+And+Field+In+A+SQL+Server+Database.aspx

在这里,在stackoverflow:search all tables, all columns for a specific value SQL Server

以及:How do I find a value anywhere in a SQL Server Database?

不幸的是,我没有看到如何在我当前的环境中实现这些方法,但我意识到可能没有办法实现我的要求。

无论是否有办法做我要问的事情,我至少想知道,所以我可以寻找另一种方法。

谢谢!

-----------------------------在SQL CE中工作的SQL SubQuery ----------- ------------------

  

SELECT * FROM UserProfile JOIN webpages_UsersInRoles   ON UserProfile.UserID = webpages_UsersInRoles.UserId   WHERE(RoleId<> 6)和电子邮件不是IN   (从UserProfile中选择电子邮件JOIN webpages_UsersInRoles    ON UserProfile.UserID = webpages_UsersInRoles.UserId    WHERE RoleId = 6)订购电子邮件

2 个答案:

答案 0 :(得分:4)

我已经从Syn123的答案中修改了SQL,这是我到目前为止所做的:

SELECT c.TABLE_NAME, c.COLUMN_NAME
FROM   INFORMATION_SCHEMA.COLUMNS AS c 
       INNER JOIN INFORMATION_SCHEMA.Tables AS t ON t.TABLE_NAME = c.TABLE_NAME
WHERE  (c.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar', 'text', 'ntext')) AND (t.TABLE_TYPE = 'TABLE')

我遇到的问题是我无法使用SQL CE进行子查询,因此无法从结果集中进行选择。如果您可以访问.MDF数据库文件,则可以编写一个小型控制台应用程序,以使用上述SQL返回的集合搜索特定关键字。您需要一种方法来创建动态SQL,而SQL CE不支持EXEC,因此这很困难,而且很可能本身无法实现。

编辑:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlServerCe;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SQLCESearch
{
    class Program
    {
        static void Main(string[] args)
        {
            SearchText("Nancy");
            Console.ReadKey();
        }

        private static void SearchText(string searchText)
        {
            string connStr = "Data Source=Northwind40.sdf;Persist Security Info=False;";
            DataTable dt = new DataTable();
            try
            {
                string sql = "SELECT c.TABLE_NAME, c.COLUMN_NAME ";
                sql += "FROM   INFORMATION_SCHEMA.COLUMNS AS c ";
                sql += "INNER JOIN INFORMATION_SCHEMA.Tables AS t ON t.TABLE_NAME = c.TABLE_NAME ";
                sql += "WHERE  (c.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar', 'text', 'ntext')) AND (t.TABLE_TYPE = 'TABLE') ";

                SqlCeDataAdapter da = new SqlCeDataAdapter(sql, connStr);
                da.Fill(dt);

                foreach (DataRow dr in dt.Rows)
                {
                    string dynSQL = "SELECT [" + dr["COLUMN_NAME"] + "]";
                    dynSQL += " FROM [" + dr["TABLE_NAME"] + "]";
                    dynSQL += " WHERE [" + dr["COLUMN_NAME"] + "] LIKE '%" + searchText + "%'";

                    DataTable result = new DataTable();
                    da = new SqlCeDataAdapter(dynSQL, connStr);
                    da.Fill(result);
                    foreach (DataRow r in result.Rows)
                    {
                        Console.WriteLine("Table Name: " + dr["TABLE_NAME"]);
                        Console.WriteLine("Column Name: " + dr["COLUMN_NAME"]);
                        Console.WriteLine("Value: " + r[0]);
                    }
                }
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
            }


        }
    }
}

有一个非常快速和脏的控制台应用程序将打印出包含文本值的任何表/列。您可以根据自己的需要进行调整。我希望这会有所帮助。

答案 1 :(得分:0)

我不确定CE,但我使用这种方法:

http://www.dbforums.com/microsoft-sql-server/972792-find-text-string-database.html

即第三个下来。在使用时阅读并理解语法,它是高度可修改的,可以按数据类型进行过滤。