Як шукати рядок у базі даних SQL Server?


121

Я знаю, що це можливо, але я не знаю як.

Мені потрібно шукати в базі даних SQL Server для всіх згадок конкретної рядка.

Наприклад: Я хотів би шукати всі таблиці, представлення, функції, збережені процедури, ... для рядка "tblE Employes" (не даних у таблицях).

Однією з причин, що мені це потрібно, я хотів би видалити кілька додаткових таблиць даних, які створюються, але я боюся, що вони, можливо, використовуються десь у процедурах чи функціях.



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

Це працює надзвичайно добре !!!


що означає 2-й парам "точноMatch = 0"?
Junchen Liu

Якщо ви подивитесь на скрипт, це лише парам, який перевіряється в заяві справи на початку, щоб вирішити, чи шукати рядок за допомогою "значення" або "% значення%"
Chizzle

5
Це повертає лише перший результат, який він знайде, і більше нічого. Чи є спосіб повернути всі екземпляри рядка в базі даних?
qroberts

1
Де мені потрібно зберегти цей скрипт і яке розширення потрібно виконати? Де я виконую exec FindMyData_string 'google', 0?
Чорний

Деякі бази даних не відрізняються від регістру, будь ласка, використовуйте INFORMATION_SCHEMA.COLUMNS у своєму коді. Інакше цей скрипт призведе до помилки "недійсне ім'я об'єкта Information_Schema".
Фатих

59

Якщо вам потрібно знайти об’єкти бази даних (наприклад, таблиці, стовпці та тригери) за назвою - подивіться на безкоштовний інструмент Redgate Software під назвою SQL Search, який робить це - він здійснює пошук у всій базі даних щодо будь-яких типів рядків.

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

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

Це чудовий обов'язковий інструмент для будь-якого розробника DBA або бази даних - чи я вже згадував, що це абсолютно безкоштовно для будь-якого використання ??


25
Хороший інструмент, але він не шукає рядки в таблицях
JGilmartin

2
Не шукає фактичних рядків
LearningJrDev

8
@LearningJrDev: ні - він шукає об'єкти бази даних - таблиці, представлення даних, збережені процедури тощо - за назвою. Він НЕ шукає в даних, що містяться в таблицях - я ніколи не стверджував, що це робив!
marc_s

4
@JGilmartin Дозвольте мені процитувати частину питання, який я хотів би шукати у всіх таблицях, видах, функціях, збережених процедурах, ... для рядка "tblEposlees". (Не дані в таблицях) Якщо ви хочете шукати дані в таблиці, у вас є 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 є приголомшливим. Немає необхідності в сценаріях з цим інструментом.
Мігель

1
Це дивовижна допомога. Оцініть це: D
miniGweek

3
Цей запит шукає лише об’єкти. Нам потрібно шукати рядок у всіх існуючих таблицях.
Сезар Леон

Хоча ApexSQL робить велику роботу, дозволяючи вибирати свої типи
PeterFnet

Я намагаюся знайти рядок у програмах та переглядах. Для мене ідеально підійде SQL. Дякую.
MsTapp

20

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


7
Це насправді не погана ідея.
Олівер Таппін

:) Ви також можете використовувати сценарій. Але хороший текстовий редактор може зробити майже все, що вам знадобиться для коду SQL.
Іван Івкович

1
А який текстовий редактор буде радий завантажувати багато ГБ даних?
Богдан

Напевно, ні, але в цьому випадку ви можете скористатися пошуковою системою сторонніх файлів, і є програми, які можуть розділити файл на стільки, скільки вам потрібно.
Іван Івкович

1
Експорт MS SQL - це двійкові файли, і тому їх не можна експортувати, читати чи шукати за допомогою запропонованого вами методу.
Спенсер Хілл

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%'

2
Цей запит шукає лише об’єкти. Нам потрібно шукати рядок у всіх існуючих таблицях.
Сезар Леон

6

Цей порядок пошуку коду та функції, але не пошук у таблиці :)

SELECT name 
FROM   sys.all_objects 
WHERE  Object_definition(object_id) 
LIKE '%text%' 
ORDER BY name

4

Ти міг;

  1. Сценарій бази даних до одного файлу та пошук у файлі для tblE Employees за допомогою текстового редактора. У студії управління SQL Server (SSMS) клацніть правою кнопкою миші на базі даних та оберіть Створити сценарії .
  2. Використовуйте SSMS "Перегляд залежностей", клацнувши правою кнопкою миші на tblE Employees, щоб побачити, які інші об'єкти залежать від нього
  3. Використовуйте безкоштовний сторонній інструмент, такий як SQL Search Redgate Software, для пошуку всіх об'єктів бази даних за іменем та вмістом за ключовим словом.

№1 звучить добре. Я просто не можу запустити його на сервері, оскільки у мене немає прав доступу.
bobetko

Дякую. Не впевнений, чому хтось вам дав -1. Я це зафіксував. Спробував RedGate ... що повністю робить те, що я хочу.
бобетко

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]

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;

Про це мало хто згадує:

  • він використовує курсори замість блокування циклу
  • він може надрукувати прогрес (відмінити, якщо потрібно)
  • він може вийти після кількох спроб (коментуйте ІЧ наприкінці)
  • він відображає всі записи
  • ви можете тонко налаштувати її за потребою

ВІДМОВА:

  • НЕ запускайте його у виробничих середовищах!
  • Це повільно . Якщо доступ до БД отримують інші служби / користувачі, будь ласка додайте "З (НОЛОК)" після кожного імені таблиці у всіх виділених, особливо динамічних виділених.
  • Він не перевіряє / захищає від різного роду параметрів ін'єкції SQL.
  • Якщо ваша база даних величезна, підготуйтеся до сну, переконайтеся, що запит не буде вбито через кілька хвилин.
  • Він передає деякі значення рядку, включаючи ints / bigints / smallints / tinyints. Якщо вони вам не потрібні, поставте їх у ті самі списки виключень із часовими позначками вгорі сценарію.

2

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

Надихнувшись @marc_s answe r, я подивився на HeidiSQL яка є програмою Windows, яка може працювати з MySQL, SQL Server та PostgreSQL.

Я виявив, що він також може шукати рядок у базі даних.

Клацніть Пошук, а потім - Знайти текст на сервері

Інструмент пошуку відкритий.  Переконайтесь, що вибрано БД

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


1

Вміст усіх збережених процедур, поглядів та функцій зберігається у тексті поля таблиць sysComments . Ім'я всіх об'єктів зберігається в таблиці sysObjects, а стовпці - у sysColumns .

Маючи цю інформацію, ви можете використовувати цей код для пошуку вмісту переглядів, збережених процедур та функцій для вказаного слова:

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

Цей запит дасть вам об’єкти, які містять слово "tblE zaposes".

Для пошуку за назвою Об'єкти ви можете використовувати цей код:

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

І нарешті, щоб знайти об’єкти, що мають принаймні один стовпець, що містить слово "tblEposlees", ви можете використовувати цей код:

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

Ви можете поєднати ці три запити з об'єднанням:

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%'

За допомогою цього запиту у вас є всі об'єкти, що містять слово "tblEposlees" за змістом чи назвою або як стовпець.


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 Object: деталі провідника об'єктів або 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
                }
            }
        }
    }
}

Ця відповідь (про 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.