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

Posted

技术标签:

【中文标题】有没有办法在 SQL Server CE 中一次搜索所有表的字段?【英文标题】:Is there a way to search the fields of all tables at once, in SQL Server CE? 【发布时间】:2013-03-04 20:13:46 【问题描述】:

我希望在 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

在这里,在 *** 上: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 子查询----------- ------------------

SELECT * FROM UserProfile JOIN pages_UsersInRoles ON UserProfile.UserID = pages_UsersInRoles.UserId WHERE (RoleId 6) AND 电子邮件不在 (从 UserProfile JOIN 网页中选择电子邮件_UsersInRoles ON UserProfile.UserID = pages_UsersInRoles.UserId WHERE RoleId = 6) 通过电子邮件订购

【问题讨论】:

您使用的是什么版本的 SQL Server CE? 你是如何“寻找一张桌子”的?你“看不到”什么?这些链接中的每一个似乎都符合您的要求;你试过了吗?发生了什么? SQL CE本身应该可以为所欲为,为什么一定要经过WebMatrix? @CameronTinker 我希望这能回答你的问题,但如果有帮助的话,我正在使用 WebMatrix 2。 我总是使用 WebMatrix - 对于 Web 应用程序,即 @CameronTinker 我还没有真正尝试过,因为我不知道如何查询它们。可以在 FROM 子句中使用通配符吗? 【参考方案1】:

我已经根据 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);
            


        
    

有一个非常快速而肮脏的控制台应用程序,可以打印出任何包含文本值的表/列。您可以对其进行调整以满足您的需求。我希望这会有所帮助。

【讨论】:

我将用一个我知道的作品定期在网络应用程序中使用的示例来更新我的帖子。 我很想看看您是如何使用 SQL CE 实现子查询的 :)。我见过一些解决方案使用连接,但是对于像你这样大的数据集来说,这确实是低效的。 好的,它已经发布了,但也许我过分简化了您所说的 subQuery 的含义,因为这是来自 SQL Server(非 CE)的示例,我什至没有为 CE 修改它。不管怎样,我现在是 5 点,我必须去,但我明天早上第一件事会回到这个帖子(我 8 点(CST)开始工作)再次感谢,明天见! 没问题。很高兴尽我所能提供帮助。 我已更新我的答案以包含一个示例控制台应用程序,该应用程序将为任何找到的文本输出表\列信息。我希望这会有所帮助。【参考方案2】:

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

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

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

【讨论】:

谢谢你的例子,如果这是一个愚蠢的问题,请原谅这个问题,但我熟悉sql查询(SELECT * FROM ... WHERE ...)等。在您发布的链接中的示例中,这只是一个 sql 查询吗?如果是这样,它有一些我以前从未见过的关键字。如果不是,它是什么语言? 这是一个MS SQL查询,它使用游标循环SQL系统表,我相信它可以变得更清晰。我回答的最大问题是它在 CE 中是否有效,如果无效,请告诉我。 我很想尝试这种方法,但我不确定我是否足够了解语法来修改它以用于我的数据库。当然不可能像复制/粘贴那么简单,不是吗? 另外,我看到的另一个错误是我将不被允许 Create_Table,因为我们从这里获得了只读访问权限。 您应该能够创建临时表,因此请按照sqlteam.com/article/temporary-tables 并在查询前添加#。就像复制粘贴一样简单,然后将您的值放入 Sargable,因此 SELECT Sargable = 'Beer' 行是您将字符串替换为搜索词的行

以上是关于有没有办法在 SQL Server CE 中一次搜索所有表的字段?的主要内容,如果未能解决你的问题,请参考以下文章

在sql server中一次插入固定数量的行2000

如何在 SQL Server 数据库中一次删除所有存储过程?

如何在 Visual Studio 2012 中查看 SQL Server CE 系统表

如何检查 SQL Server CE 数据库的索引?

如何只修改一次sql server ce的列数据类型的长度?

有没有办法在 Swift 中一次将委托分配给同一类的多个对象?