Есть ли способ выполнить поиск в полях всех таблиц сразу в SQL Server CE?

Я надеялся, что в среде 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+Сервер+Database.aspx

И здесь, в stackoverflow: поиск по всем таблицам, все столбцы для определенного значения SQL Server

А также здесь: Как мне найти значение где-нибудь в базе данных SQL Server?

К сожалению, я не вижу, как реализовать эти методы в моей текущей среде, но я понимаю, что на самом деле может не быть способа сделать то, о чем я прошу.

Есть ли способ сделать то, о чем я прошу, или нет, я хотел бы по крайней мере знать, чтобы я мог поискать другой метод.

Спасибо!

----------------------------- Подзапрос SQL, который работает в SQL CE -------------- ---------------

ВЫБЕРИТЕ * ИЗ UserProfile JOIN webpages_UsersInRoles ON UserProfile.UserID = webpages_UsersInRoles.UserId WHERE (RoleId ‹> 6) И электронная почта НЕ ВХОДИТ (ВЫБЕРИТЕ электронную почту ИЗ UserProfile JOIN webpages_UsersInRoles ON UserProfile WHI.UserProfile.UserProfile.Use_ID = 6) Электронная почта.


person VoidKing    schedule 04.03.2013    source источник
comment
Какую версию SQL Server CE вы используете?   -  person Cameron Tinker    schedule 05.03.2013
comment
Как вы пытаетесь искать стол? Что ты не видишь? Кажется, что каждая из этих ссылок делает то, что вы просили; ты пробовал их? Что случилось? Сам SQL CE должен уметь делать то, что вы хотите, зачем вам использовать WebMatrix?   -  person Dour High Arch    schedule 05.03.2013
comment
@CameronTinker Надеюсь, это ответит на ваш вопрос, но я использую WebMatrix 2, если это поможет.   -  person VoidKing    schedule 05.03.2013
comment
Я всегда использую WebMatrix - для веб-приложений, то есть   -  person VoidKing    schedule 05.03.2013
comment
@CameronTinker Я толком не пробовал, потому что не знаю, как их запросить. Можно ли использовать подстановочный знак в предложении FROM?   -  person VoidKing    schedule 05.03.2013
comment
Единственная причина, по которой я спрашиваю о вашей версии SQL CE, заключается в том, что в SQL CE 4.0 появились новые функции, которые недоступны в SQL CE 3.5.   -  person Cameron Tinker    schedule 05.03.2013
comment
@CameronTinker Дай мне посмотреть, смогу ли я узнать. Одну секунду...   -  person VoidKing    schedule 05.03.2013
comment
@CameronTinker Это SQL CE 4.0   -  person VoidKing    schedule 05.03.2013
comment
Я ищу решение для запросов без создания таблиц. Однако это будет менее эффективно.   -  person Cameron Tinker    schedule 05.03.2013
comment
@CameronTinker Ничего страшного, с производительностью проблем не будет. Мне вообще не придется делать это очень часто.   -  person VoidKing    schedule 05.03.2013
comment
У вас есть доступ к самому файлу базы данных? Кажется, что SQL CE очень ограничен в том, что можно делать при запросах. Возможно, если у вас есть доступ к самому файлу базы данных, вы можете написать небольшое приложение для перебора наборов результатов.   -  person Cameron Tinker    schedule 05.03.2013
comment
позвольте нам продолжить обсуждение в чате   -  person Cameron Tinker    schedule 05.03.2013


Ответы (2)


Я адаптировал SQL из ответа Syn123, и вот что у меня есть:

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);
            }


        }
    }
}

Есть действительно быстрое и грязное консольное приложение, которое распечатает любую таблицу / столбец, содержащую значение текста. Вы можете адаптировать его под свои нужды. Надеюсь, это поможет.

person Cameron Tinker    schedule 04.03.2013
comment
Я дополню свой пост примером работ, которые я ЗНАЮ, и которые регулярно используются в веб-приложениях. - person VoidKing; 05.03.2013
comment
Мне интересно узнать, как вы выполняли подзапросы с помощью SQL CE :). Я видел, как в некоторых решениях используются объединения, но это действительно неэффективно для такого большого набора данных, как ваш. - person Cameron Tinker; 05.03.2013
comment
Хорошо, он опубликован, но, возможно, я слишком упрощаю то, что вы имеете в виду под subQuery, потому что это пример из SQL Server (не CE), я даже не модифицировал его для CE. В любом случае, сейчас 5, где я, и мне нужно идти, но я вернусь к этому посту завтра утром (я иду на работу в 8 (CST)) Еще раз спасибо, увидимся завтра! - person VoidKing; 05.03.2013
comment
Без проблем. Рад помочь чем могу. - person Cameron Tinker; 05.03.2013
comment
Я обновил свой ответ, включив в него пример консольного приложения, которое будет выводить информацию о таблице \ столбце для любого найденного текста. Надеюсь, это поможет. - person Cameron Tinker; 05.03.2013
comment
позвольте нам продолжить обсуждение в чате - person Cameron Tinker; 05.03.2013

Насчет CE я не уверен, но использую такой метод:

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

а именно третий внизу. Прочтите и поймите синтаксис по мере его использования, он легко модифицируется и может фильтровать по типу данных.

person RandomUs1r    schedule 04.03.2013
comment
Спасибо за ваш пример, и, пожалуйста, простите этот вопрос, если он глупый, но я знаком с запросами sql (SELECT * FROM ... WHERE ...) и т. Д. В примере в опубликованной вами ссылке это просто запрос sql? Если так, то в нем есть ключевые слова, которых я никогда раньше не видел. Если нет, то на каком это языке? - person VoidKing; 05.03.2013
comment
Это запрос MS SQL, который использует курсор для циклического перебора системных таблиц SQL, я уверен, что его можно сделать более разборчивым. Большой вопрос с моим ответом: будет ли он работать в CE, дайте мне знать, если это не так. - person RandomUs1r; 05.03.2013
comment
Я хотел бы попробовать этот метод, но я не уверен, что понимаю достаточно синтаксиса, чтобы изменить его для использования с моей базой данных. Конечно, это не может быть так просто, как копирование / вставка, не так ли? - person VoidKing; 05.03.2013
comment
Кроме того, я вижу еще одну ошибку: мне не будет разрешено использовать Create_Table, потому что с этого конца у нас есть доступ только для чтения. - person VoidKing; 05.03.2013
comment
у вас должна быть возможность создавать временные таблицы, поэтому следуйте sqlteam.com/article/ Contemporary-tables и добавьте # перед запросом. Это так же просто, как скопировать и вставить, а затем поместить свое значение в Sargable, поэтому строка SELECT Sargable = 'Beer' - это та строка, на которой вы бы заменили строку своим поисковым запросом - person RandomUs1r; 05.03.2013
comment
Я пробовал то, что вы сказали, но получаю другую ошибку: недопустимое имя объекта myTable99. После помещения # перед myTable99 - person VoidKing; 05.03.2013
comment
Операторы Declare не поддерживаются SQL CE. Кроме того, в SQL CE не существует временных таблиц. - person Cameron Tinker; 05.03.2013
comment
@ Syn123 Ну, я думаю, это означает, что у меня, вероятно, нет вариантов :( Большое спасибо за попытку помочь. По крайней мере, теперь я знаю. - person VoidKing; 05.03.2013
comment
Пока не сдавайся. Я почти что-то понял. - person Cameron Tinker; 05.03.2013
comment
@CameronTinker Хорошо, я не буду, большое спасибо за помощь! Если это поможет в дальнейшем, мне даже не нужно «закодированное» решение. Дело в том, что я думаю, что беру данные где-то не из той таблицы, и мне нужно проверить, есть ли эти значения в другой таблице (но их сотни! Вероятно, они близки к тысяче, а может и больше, я перестал считать на 200 в б). Мне действительно нужно найти этот стол только один раз. Похоже, что никто больше ничего не знает о его содержимом, потому что это стороннее программное обеспечение. - person VoidKing; 05.03.2013
comment
@CameronTinker Только что понял, что это ты сказал мне, что SQL CE не поддерживает операторы объявления или временные таблицы. Сожалею об этом. - person VoidKing; 05.03.2013
comment
К сожалению, если вам когда-нибудь понадобится решение для MS SQL, оно будет здесь. Звучит так, будто Кэмерон знает о специфических для версии нюансах CE, парень по моей ссылке создает базовую таблицу всех таблиц в базе данных, а затем повторяет их с помощью предложения Like о значении, которое вы ищу возвращение всех положительных совпадений. - person RandomUs1r; 05.03.2013
comment
Без проблем. Вскоре я дам вам ответ. - person Cameron Tinker; 05.03.2013
comment
@CameronTinker Отлично! Если вы придумаете решение, не забудьте опубликовать ответ, чтобы я мог согласиться :) - person VoidKing; 05.03.2013