Как искать строку в базе данных SQL Server?

121

Я знаю, что это возможно, но не знаю как.

Мне нужно найти в базе данных SQL Server все упоминания определенной строки.

Например: я хотел бы искать во всех таблицах, представлениях, функциях, хранимых процедурах ... строку "tblEmployes" (не данные в таблицах).

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

Бобетко
источник
6
Redgate SQL Search
Микаэль Эрикссон
1
Надеюсь, это кому-то поможет, stackoverflow.com/questions/13174627/…
NoNaMe

Ответы:

155

Это будет искать каждый столбец каждой таблицы в определенной базе данных. Создайте хранимую процедуру в базе данных, в которой вы хотите искать.

Десять наиболее часто задаваемых вопросов по SQL Server и ответы на них :

CREATE PROCEDURE FindMyData_String
    @DataToFind NVARCHAR(4000),
    @ExactMatch BIT = 0
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
    SELECT  C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type
    FROM    Information_Schema.Columns AS C
            INNER Join Information_Schema.Tables AS T
                ON C.Table_Name = T.Table_Name
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
    WHERE   Table_Type = 'Base Table'
            And Data_Type In ('ntext','text','nvarchar','nchar','varchar','char')


DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname
DECLARE @ColumnName sysname
DECLARE @SchemaName sysname
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)

SELECT  @SQLTemplate = CASE WHEN @ExactMatch = 1
                            THEN 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       = ''' + @DataToFind + '''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            ELSE 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       Like ''%' + @DataToFind + '%''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            END,
        @PARAMETERS = '@DataExists Bit OUTPUT',
        @i = 1

SELECT @i = 1, @MAX = MAX(RowId)
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
        FROM    @Temp
        WHERE   RowId = @i


        PRINT @SQL
        EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i

        SET @i = @i + 1
    END

SELECT  SchemaName,TableName, ColumnName
FROM    @Temp
WHERE   DataFound = 1
GO

Чтобы запустить его, просто сделайте следующее:

exec FindMyData_string 'google', 0

Работает на удивление хорошо !!!

л --''''''--------- «» «» «» «» «» «»
источник
что означает второй параметр «точное соответствие = 0»?
Junchen Liu
Если вы посмотрите на скрипт, это просто параметр, который проверяется в операторе case на ранней стадии, чтобы решить, следует ли строковый поиск с использованием 'value' или '% value%'
Chizzle
5
Это возвращает только первый найденный результат и ничего больше. Есть ли способ вернуть все экземпляры строки в базе данных?
qroberts
1
Где мне сохранить этот сценарий и с каким расширением файл должен быть запущен? Где казнить exec FindMyData_string 'google', 0?
Black
В некоторых базах данных регистр не учитывается, пожалуйста, используйте INFORMATION_SCHEMA.COLUMNS в своем коде. В противном случае этот сценарий выдаст ошибку «недопустимое имя объекта Information_Schema».
Fatih
59

Если вам нужно найти объекты базы данных (например, таблицы, столбцы и триггеры) по имени - взгляните на бесплатный программный инструмент Redgate под названием SQL Search, который делает это - он выполняет поиск по всей базе данных для любых строк.

Введите описание изображения здесь

Введите описание изображения здесь

Это отличный незаменимый инструмент для любого администратора баз данных или разработчика баз данных - я уже упоминал, что он абсолютно бесплатен для любого использования ??

marc_s
источник
25
Хороший инструмент, но он не ищет строки в таблицах
JGilmartin 03
2
Не выполняет поиск в фактических строках
LearningJrDev
8
@LearningJrDev: no - ищет объекты базы данных - таблицы, представления, хранимые процедуры и т. Д. - по имени. Он НЕ выполняет поиск в данных, содержащихся в таблицах - я никогда не утверждал, что это делал!
marc_s
4
@JGilmartin Позвольте мне процитировать часть вопроса, которую я хотел бы найти во всех таблицах, представлениях, функциях, хранимых процедурах, ... на строку "tblEmployes". (Не данные в таблицах) Если вы хотите искать данные в таблице, у вас есть язык T-SQL. Этот инструмент отлично подходит для задач рефакторинга.
nemke
49

Вы также можете попробовать ApexSQL Search - это бесплатный SSMS надстроек похож на SQL Search .

Если вы действительно хотите использовать только SQL, вы можете попробовать этот сценарий:

select
S.name as [Schema],
o.name as [Object],
o.type_desc as [Object_Type],
C.text as [Object_Definition]
from sys.all_objects O inner join sys.schemas S on O.schema_id = S.schema_id
inner join sys.syscomments C on O.object_id = C.id
where S.schema_id not in (3,4) -- avoid searching in sys and INFORMATION_SCHEMA schemas
and C.text like '%ICE_%'
order by [Schema]
Джордж Обер
источник
4
Поиск ApexSQL потрясающий. Для этого инструмента не нужны скрипты.
Miguel
1
Это отличный помощник. Оцените это: D
miniGweek 01
3
Этот запрос ищет только объекты. Нам нужно искать строку во всех существующих таблицах.
Сезар Леон
ApexSQL, тем не менее, позволяет вам выбирать типы
PeterFnet
Я пытаюсь найти строку в процедурах и представлениях. SQL идеально подходит для меня. Спасибо.
MsTapp
20

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

Иван Ивкович
источник
7
На самом деле это неплохая идея.
Оливер Таппин
:) Вы тоже можете использовать скрипт. Но хороший текстовый редактор может делать почти все, что вам нужно для кода SQL.
Иван Ивкович
1
И какой текстовый редактор был бы рад загрузить много ГБ данных?
Богдан
Вероятно, нет, но в этом случае вы можете использовать стороннюю систему поиска файлов, и есть приложения, которые могут разбить файл на любое количество частей.
Иван Ивкович
1
Экспорт MS SQL представляет собой двоичные файлы, поэтому их нельзя экспортировать, прочитать или выполнить поиск с помощью предложенного вами метода.
Spencer Hill
17

Для получения таблицы по имени в SQL Server:

SELECT *
FROM sys.Tables
WHERE name LIKE '%Employees%'

Для поиска хранимой процедуры по имени:

SELECT name
FROM sys.objects
WHERE name = 'spName'

Чтобы получить все хранимые процедуры, относящиеся к таблице:

----Option 1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
----Option 2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
TheBoyan
источник
2
Это запросы только поиск объектов. Нам нужно искать строку во всех существующих таблицах.
Сезар Леон
6

Эта процедура и функция поиска кода, но не поиск в таблице :)

SELECT name 
FROM   sys.all_objects 
WHERE  Object_definition(object_id) 
LIKE '%text%' 
ORDER BY name
айкут айдоган
источник
4

Ты мог;

  1. Создайте сценарий базы данных для одного файла и найдите в этом файле tblEmployees с помощью текстового редактора. В SQL Server Management Studio (SSMS) щелкните правой кнопкой мыши базу данных и выберите « Создать сценарии» .
  2. Используйте SSMS 'View Dependencies', щелкнув правой кнопкой мыши по tblEmployees, чтобы увидеть, какие другие объекты зависят от него.
  3. Используйте бесплатный сторонний инструмент, такой как SQL Search от Redgate Software, для поиска всех объектов базы данных по имени и содержимого по ключевому слову.
ajayel
источник
№1 звучит хорошо. Я просто не могу запустить его на сервере, потому что у меня нет прав доступа.
bobetko
Спасибо. Не уверен, почему кто-то дал вам -1. Я исправил это. Пробовал RedGate ... это полностью то, что я хочу.
bobetko
2

Это будет искать строку по каждой базе данных:

declare @search_term varchar(max)
set @search_term = 'something'

select @search_term = 'use ? SET QUOTED_IDENTIFIER ON
select
    ''[''+db_name()+''].[''+c.name+''].[''+b.name+'']'' as [object],
    b.type_desc as [type],
    d.obj_def.value(''.'',''varchar(max)'') as [definition]
from (
    select distinct
        a.id
    from sys.syscomments a
    where a.[text] like ''%'+@search_term+'%''
) a
inner join sys.all_objects b
    on b.[object_id] = a.id
inner join sys.schemas c
    on c.[schema_id] = b.[schema_id]
cross apply (
    select
        [text()] = a1.[text]
    from sys.syscomments a1
    where a1.id = a.id
    order by a1.colid
    for xml path(''''), type
) d(obj_def)
where c.schema_id not in (3,4) -- avoid searching in sys and INFORMATION_SCHEMA schemas
    and db_id() not in (1,2,3,4) -- avoid sys databases'

if object_id('tempdb..#textsearch') is not null drop table #textsearch
create table #textsearch
(
    [object] varchar(300),
    [type] varchar(300),
    [definition] varchar(max)
)

insert #textsearch
exec sp_MSforeachdb @search_term

select *
from #textsearch
order by [object]
kinzleb
источник
2

Моя версия ...

Я назвал его «Игла в стоге сена» по понятным причинам.

Он ищет определенное значение в каждой строке и каждом столбце, а не по именам столбцов и т. Д.

Выполните поиск (конечно, замените значения первых двух переменных):

DECLARE @SEARCH_DB VARCHAR(100)='REPLACE_WITH_YOUR_DB_NAME'
DECLARE @SEARCH_VALUE_LIKE NVARCHAR(100)=N'%REPLACE_WITH_SEARCH_STRING%'

SET NOCOUNT ON;
DECLARE col_cur CURSOR FOR
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM information_schema.columns WHERE TABLE_CATALOG=@SEARCH_DB AND DATA_TYPE NOT IN ('timestamp', 'datetime');

DECLARE @TOTAL int = (SELECT COUNT(*)
FROM information_schema.columns WHERE TABLE_CATALOG=@SEARCH_DB AND DATA_TYPE NOT IN ('timestamp', 'datetime'));


DECLARE @TABLE_CATALOG nvarchar(500), @TABLE_SCHEMA nvarchar(500), @TABLE_NAME nvarchar(500), @COLUMN_NAME nvarchar(500), @DATA_TYPE nvarchar(500);
DECLARE @SQL nvarchar(4000)='';

PRINT '-------- BEGIN SEARCH --------';
OPEN col_cur;

FETCH NEXT FROM col_cur INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME, @DATA_TYPE;

BEGIN TRY DROP TABLE ##RESULTS; END TRY BEGIN CATCH END CATCH
CREATE TABLE ##RESULTS( TABLE_CATALOG nvarchar(500), TABLE_SCHEMA nvarchar(500), TABLE_NAME nvarchar(500), COLUMN_NAME nvarchar(500), DATA_TYPE nvarchar(500), RECORDS int)
DECLARE @SHOULD_CAST bit=0
DECLARE @i int =0
DECLARE @progress_sum bigint=0

WHILE @@FETCH_STATUS = 0
BEGIN
    -- PRINT '' + CAST(@i as varchar(100)) +' of ' + CAST(@TOTAL as varchar(100)) + '  ' + @TABLE_CATALOG+'.'+@TABLE_SCHEMA+'.'+@TABLE_NAME+': '+@COLUMN_NAME+' ('+@DATA_TYPE+')';

    SET @SHOULD_CAST = (SELECT CASE @DATA_TYPE
                                WHEN 'varchar' THEN 0
                                WHEN 'nvarchar' THEN 0
                                WHEN 'char' THEN 0
                                ELSE 1 END)

    SET @SQL='SELECT '''+@TABLE_CATALOG+''' catalog_name, '''+@TABLE_SCHEMA+''' schema_name, '''+@TABLE_NAME+''' table_name, '''+@COLUMN_NAME+''' column_name, '''+@DATA_TYPE+''' data_type, ' +
            +' COUNT(['+@COLUMN_NAME+']) records '+
            +' FROM '+@TABLE_CATALOG+'.'+@TABLE_SCHEMA+'.'+@TABLE_NAME +
            +' WHERE ' + CASE WHEN @SHOULD_CAST=1 THEN 'CAST(['+@COLUMN_NAME + '] as NVARCHAR(max)) ' ELSE ' ['+@COLUMN_NAME + '] ' END
            +' LIKE '''+ @SEARCH_VALUE_LIKE + ''' '

    -- PRINT @SQL;

    IF @i % 100 = 0
        BEGIN
            SET @progress_sum = (SELECT SUM(RECORDS) FROM ##RESULTS)
            PRINT CAST (@i as varchar(100)) +' of ' + CAST(@TOTAL as varchar(100)) +': '+ CAST (@progress_sum as varchar(100))
        END

    INSERT INTO ##RESULTS (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, RECORDS)
    EXEC(@SQL)

    FETCH NEXT FROM col_cur INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME, @DATA_TYPE;
    SET @i=@i+1
    -- IF @i > 1000
    --     BREAK
END
CLOSE col_cur;
DEALLOCATE col_cur;

SELECT * FROM ##RESULTS WHERE RECORDS>0;

Затем для просмотра результатов даже во время выполнения из другого окна выполните:

DECLARE @SEARCH_VALUE_LIKE NVARCHAR(100)=N'%@FLEX@%'
SELECT * FROM ##RESULTS WHERE RECORDS>0;

SET NOCOUNT ON;
DECLARE col_cur CURSOR FOR
SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM ##RESULTS WHERE RECORDS>0;

DECLARE @TABLE_CATALOG nvarchar(500), @TABLE_SCHEMA nvarchar(500), @TABLE_NAME nvarchar(500), @COLUMN_NAME nvarchar(500), @DATA_TYPE nvarchar(500);
DECLARE @SQL nvarchar(4000)='';

OPEN col_cur;

FETCH NEXT FROM col_cur INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME, @DATA_TYPE;
DECLARE @i int =0
DECLARE @SHOULD_CAST bit=0

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SHOULD_CAST = (SELECT CASE @DATA_TYPE
                                WHEN 'varchar' THEN 0
                                WHEN 'nvarchar' THEN 0
                                WHEN 'char' THEN 0
                                ELSE 1 END)

    SET @SQL='SELECT '''+@TABLE_CATALOG+''' catalog_name, '''+@TABLE_SCHEMA+''' schema_name, '''+@TABLE_NAME+''' table_name, '''+@COLUMN_NAME+''' column_name, '''+@DATA_TYPE+''' data_type, ' +
            +' ['+@COLUMN_NAME+']'+
            +', * '
            +' FROM '+@TABLE_CATALOG+'.'+@TABLE_SCHEMA+'.'+@TABLE_NAME +
            +' WHERE ' + CASE WHEN @SHOULD_CAST=1 THEN 'CAST(['+@COLUMN_NAME + '] as NVARCHAR(max)) ' ELSE ' ['+@COLUMN_NAME + '] ' END
            +' LIKE '''+ @SEARCH_VALUE_LIKE + ''' '

    PRINT @SQL;

    EXEC(@SQL)

    FETCH NEXT FROM col_cur INTO @TABLE_CATALOG, @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME, @DATA_TYPE;
    SET @i=@i+1
    -- IF @i > 10
    --    BREAK
END
CLOSE col_cur;
DEALLOCATE col_cur;

Несколько упоминаний об этом:

  • он использует курсоры вместо блокирующего цикла while
  • он может распечатать прогресс (при необходимости раскомментируйте)
  • он может выйти после нескольких попыток (раскомментируйте IF в конце)
  • он отображает все записи
  • вы можете настроить его по мере необходимости

ОТКАЗЫ:

  • НЕ запускайте его в производственной среде!
  • Это медленно . Если DB получает доступ других услуг / пользователей, пожалуйста , добавьте «С (NOLOCK)» после того, как каждое имя таблицы во всех выбирает, особенно динамический выбор из них.
  • Он не проверяет и не защищает от всех типов SQL-инъекций.
  • Если ваша БД огромна, приготовьтесь немного поспать, убедитесь, что запрос не будет уничтожен через несколько минут.
  • Он преобразует некоторые значения в строку, включая ints / bigints / smallints / tinyints. Если они вам не нужны, поместите их в те же списки исключений с отметками времени в верхней части скрипта.
user682385
источник
2

Мне был предоставлен доступ к базе данных, но не к таблице, в которой хранился мой запрос.

Вдохновленный ответом @marc_s , я взглянул на HeidiSQL, программу для Windows, которая может работать с MySQL, SQL Server и PostgreSQL.

Я обнаружил, что он также может искать строку в базе данных.

Нажмите "Поиск", затем "Найти текст на сервере".

Инструмент поиска открыт.  Убедитесь, что БД выбрана

Он будет искать каждую таблицу и сообщать вам, сколько раз он нашел строку для каждой таблицы!

Ari
источник
1

Содержимое всех хранимых процедур, представлений и функций хранится в тексте поля таблицы sysComments . Имя всех объектов хранится в таблице sysObjects, а столбцы - в sysColumns .

Имея эту информацию, вы можете использовать этот код для поиска в содержимом представлений, хранимых процедур и функций по указанному слову:

Select b.name from syscomments a
inner join sysobjects b on a.id = b.id
where text like '%tblEmployes%'

Этот запрос предоставит вам объекты, содержащие слово «tblEmployes».

Для поиска по названию объектов вы можете использовать этот код:

Select name from sysobjects
where name like  '%tblEmployes%'

И, наконец, чтобы найти объекты, имеющие хотя бы один столбец, содержащий слово «tblEmployes», вы можете использовать этот код:

Select b.name from syscolumns a inner join sysobjects b on a.id = b.id
where a.name like  '%tblEmployes%'

Вы можете объединить эти три запроса с помощью union:

Select distinct b.name from syscomments a
inner join sysobjects b on a.id = b.id
where text like '%tblEmployes%'
union
Select distinct name from sysobjects
where name like  '%tblEmployes%'
union
Select distinct b.name from syscolumns a inner join sysobjects b on a.id = b.id
where a.name like  '%tblEmployes%'

С помощью этого запроса у вас есть все объекты, содержащие слово «tblEmployes» в содержимом, имени или столбце.

Мехди Акбари
источник
0

Вот тот же сценарий, что был отправлен пользователем l --'''''--------- '' '' '' '' '' '' , но исправленный для работы с чувствительным к регистру SQL экземпляра, и с некоторыми другими незначительными улучшениями.

DROP PROCEDURE IF EXISTS dbo.spFind_Text_In_Database
GO

CREATE PROCEDURE dbo.spFind_Text_In_Database
    @strText_To_Find NVARCHAR(4000),
    @bitExact_Match BIT = 0
AS
SET NOCOUNT ON

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)

    INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
    SELECT  C.TABLE_NAME, C.TABLE_SCHEMA, C.COLUMN_NAME, C.DATA_TYPE
    FROM    INFORMATION_SCHEMA.COLUMNS AS C
            INNER Join INFORMATION_SCHEMA.TABLES AS T
                ON C.TABLE_NAME = T.TABLE_NAME
        AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
    WHERE   TABLE_TYPE = 'BASE TABLE'
            And DATA_TYPE In ('ntext','text','nvarchar','nchar','varchar','char')


DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName sysname
DECLARE @ColumnName sysname
DECLARE @SchemaName sysname
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)

SELECT  @SQLTemplate = CASE WHEN @bitExact_Match = 1
                            THEN 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       = ''' + @strText_To_Find + '''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            ELSE 'If Exists(Select *
                                          From   ReplaceTableName
                                          Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                       Like ''%' + @strText_To_Find + '%''
                                          )
                                     Set @DataExists = 1
                                 Else
                                     Set @DataExists = 0'
                            END,
        @PARAMETERS = '@DataExists Bit OUTPUT',
        @i = 1

SELECT @i = 1, @MAX = MAX(RowId)
FROM   @Temp

WHILE @i <= @MAX
    BEGIN
        SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
        FROM    @Temp
        WHERE   RowId = @i


        PRINT @SQL
        EXEC sp_executesql @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT

        IF @DataExists =1
            UPDATE @Temp SET DataFound = 1 WHERE RowId = @i

        SET @i = @i + 1
    END

SELECT  SchemaName,TableName, ColumnName
FROM    @Temp
WHERE   DataFound = 1
GO
Майк
источник
0

Поиск объектов базы данных SQL возможен с помощью SQL Server Management Studio (SSMS) с помощью следующих методов, с помощью поиска объектов SSMS: сведения об обозревателе объектов или сценарии T-SQL, как описано ниже:

Орхан Челик
источник
0

Вот как можно выполнять поиск в базе данных в Swift с помощью библиотеки FMDB.

Сначала перейдите по этой ссылке и добавьте это в свой проект: FMDB . Когда вы это сделаете, вот как вы это сделаете. Например, у вас есть таблица с именем Person, у вас есть firstName и secondName, и вы хотите найти данные по имени, вот код для этого:

    func loadDataByfirstName(firstName : String, completion: @escaping CompletionHandler){
    if isDatabaseOpened {
        let query = "select * from Person where firstName like '\(firstName)'"
        do {
            let results = try database.executeQuery(query, values: [firstName])
            while results.next() {
                let firstName = results.string(forColumn: "firstName") ?? ""
                let lastName = results.string(forColumn: "lastName") ?? ""
                let newPerson = Person(firstName: firstName, lastName: lastName)
                self.persons.append(newPerson)
            }
            completion(true)
        }catch let err {
            completion(false)
            print(err.localizedDescription)
        }
        database.close()
    }
}

Затем в своем ViewController вы напишите это, чтобы найти информацию о человеке, которого вы ищете:

  override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)
      SQLManager.instance.openDatabase { (success) in
        if success {
            SQLManager.instance.loadDataByfirstName(firstName: "Hardi") { (success) in
                if success {
                    // You have your data Here
                }
            }
        }
    }
}
hardiBSalih
источник
Этот ответ (о SQLite) не отвечает на вопрос. Вопрос касался SQL Server (продукта Microsoft - хотя они также виноваты в выборе такого общего названия для продукта). Со страницы GitHub: « FMDB v2.7 ... Это оболочка Objective-C вокруг SQLite »
Питер Мортенсен
0

Если я хочу найти то, что я хочу найти, я использую это:

DECLARE @search_string    varchar(200)
    SET @search_string = '%myString%'

    SELECT DISTINCT
           o.name AS Object_Name,
           o.type_desc,
           m.definition
      FROM sys.sql_modules m
           INNER JOIN
           sys.objects o
             ON m.object_id = o.object_id
     WHERE m.definition Like @search_string;
Маржол Мехалла
источник