Como pesquiso uma cadeia de dados do SQL Server?

121

Eu sei que é possível, mas não sei como.

Preciso pesquisar em um banco de dados do SQL Server todas as menções de uma sequência específica.

Por exemplo: eu gostaria de pesquisar todas as tabelas, visualizações, funções, procedimentos armazenados, ... pela string "tblEmployes" (não dados nas tabelas).

Uma das razões pelas quais eu preciso disso é que eu gostaria de remover algumas tabelas de dados extras criadas, mas tenho medo de que elas talvez sejam usadas em algum lugar em procedimentos ou funções.

bobetko
fonte
6
redgate SQL Search
Mikael Eriksson
1
Espero que isso vai ajudar alguém, stackoverflow.com/questions/13174627/...
NoName

Respostas:

155

Isso pesquisará todas as colunas de todas as tabelas em um banco de dados específico. Crie o procedimento armazenado no banco de dados que você deseja pesquisar.

As dez perguntas mais frequentes do SQL Server e suas respostas :

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

Para executá-lo, faça o seguinte:

exec FindMyData_string 'google', 0

Funciona incrivelmente bem !!!

eu--''''''---------''''''''''''
fonte
o que significa o segundo parâmetro "exactMatch = 0"?
Junchen Liu
Se você olhar para o script é apenas um parâmetro que é verificada em um comunicado caso cedo para decidir se a seqüência de pesquisar usando 'value' ou '% value%'
Chizzle
5
Isso retorna apenas o primeiro resultado encontrado e nada mais. Existe uma maneira de retornar todas as instâncias da string no banco de dados?
qroberts
1
Onde eu tenho que salvar esse script e qual extensão o arquivo precisa ser executado? Onde eu executo exec FindMyData_string 'google', 0?
Preto
Alguns bancos de dados não diferenciam maiúsculas de minúsculas, use INFORMAÇÕES_SCHEMA.COLUMNS no seu código. Caso contrário, este script lançará o erro 'nome do objeto inválido Information_Schema'.
Fatih
59

Se você precisar encontrar objetos de banco de dados (por exemplo, tabelas, colunas e gatilhos) por nome - dê uma olhada na ferramenta gratuita Redgate Software chamada SQL Search que faz isso - ele pesquisa em todo o banco de dados qualquer tipo de string (s).

Enter image description here

Enter image description here

É uma ótima ferramenta imprescindível para qualquer desenvolvedor de banco de dados ou DBA - eu já mencionei que é totalmente gratuito para qualquer tipo de uso?

marc_s
fonte
25
Boa ferramenta, mas não procurar cadeias em tabelas
JGilmartin
2
Não pesquisa as linhas reais #
LearningJrDev
8
@LearningJrDev: no - pesquisa os objetos do banco de dados - tabelas, visualizações, procedimentos armazenados etc. - por nome. Ele não procurar nos dados contidos nas tabelas - Eu nunca disse que fez!
marc_s
4
@JGilmartin Deixe-me citar parte da pergunta que gostaria de pesquisar em todas as tabelas, visualizações, funções, procedimentos armazenados, ... pela string "tblEmployes". (Não há dados nas tabelas) Se você deseja pesquisar dados na tabela, possui a linguagem T-SQL. Essa ferramenta é ótima para tarefas de refatoração.
nemke
49

Você também pode experimentar o ApexSQL Search - é um suplemento gratuito do SSMS semelhante ao SQL Search .

Se você realmente deseja usar apenas SQL, tente este script:

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]
George Ober
fonte
4
A pesquisa do ApexSQL é incrível. Não há necessidade de scripts com esta ferramenta.
Miguel
1
Este é um companheiro de ajuda incrível. Aprecie: D
miniGweek
3
Esta consulta procura apenas objetos. Precisamos procurar uma string em todas as tabelas existentes.
César León
ApexSQL que faz um grande trabalho de deixá-lo escolher seus tipos
PeterFnet
Estou tentando encontrar uma string dentro de procs e views. O SQL é perfeito para mim. Obrigado.
MsTapp
20

Você pode exportar seu banco de dados (se pequeno) para o disco rígido / área de trabalho e, em seguida, basta fazer uma pesquisa de string por meio de um programa de pesquisa de texto ou editor de texto.

Ivan Ivković
fonte
7
Na verdade, isso não é uma má idéia.
Oliver Tappin
:) Você também pode usar um script. Mas um bom editor de texto pode fazer quase tudo o que você precisa para um código SQL.
Ivan Ivković 21/03
1
E qual editor de texto ficaria feliz em carregar muitos GBs de dados?
Bohdan
Provavelmente não, mas nesse caso você pode usar um mecanismo de busca de arquivos de terceiros e existem aplicativos que podem dividir o arquivo em quantas partes você desejar.
Ivan Ivković 24/16
1
As exportações do MS SQL são arquivos binários e, portanto, não podem ser exportadas, lidas ou pesquisadas usando o método proposto.
Spencer Colina
17

Para obter uma tabela por nome no SQL Server:

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

Para localizar um procedimento armazenado por nome:

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

Para obter todos os procedimentos armazenados relacionados a uma tabela:

----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
fonte
2
Esta consulta procura apenas objetos. Precisamos procurar uma string em todas as tabelas existentes.
César León
6

Este código pesquisando procedimento e função, mas não pesquisa na tabela :)

SELECT name 
FROM   sys.all_objects 
WHERE  Object_definition(object_id) 
LIKE '%text%' 
ORDER BY name
aykut aydoğan
fonte
4

Você poderia;

  1. Script do banco de dados em um único arquivo e procure tblEmployees no arquivo usando um editor de texto. No SQL Server Management Studio (SSMS), clique com o botão direito do mouse no banco de dados e escolha Gerar scripts .
  2. Use SSMS 'View Dependencies' clicando com o botão direito do mouse em tblEmployees para ver quais outros objetos dependem dele
  3. Use uma ferramenta gratuita de terceiros, como a Pesquisa SQL do Redgate Software, para pesquisar todos os objetos de banco de dados por nome e conteúdo por palavra-chave.
ajayel
fonte
# 1 parece bom. Eu simplesmente não consigo executá-lo no servidor porque não tenho direitos de acesso.
22812 bobetko
Obrigado. Não sei por que alguém lhe deu -1. Eu consertei isso. Tentei RedGate ... que faz totalmente o que eu quero.
22812 bobetko
2

Isso procurará uma cadeia de caracteres em todos os bancos de dados:

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
fonte
2

Minha versão ...

Chamei de "Agulha no palheiro" por razões óbvias.

Ele procura um valor específico em cada linha e cada coluna, não em nomes de colunas, etc.

Execute a pesquisa (substitua os valores das duas primeiras variáveis, é claro):

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;

Para visualizar os resultados, mesmo durante a execução, de outra janela, execute:

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;

Poucas menções sobre isso:

  • usa cursores em vez de um loop while de bloqueio
  • pode imprimir progresso (descomente se necessário)
  • ele pode sair após algumas tentativas (descomente o FI no final)
  • exibe todos os registros
  • você pode ajustá-lo conforme necessário

AVISO LEGAL:

  • NÃO o execute em ambientes de produção!
  • Está lento . Se o banco de dados for acessado por outros serviços / usuários, por favor adicione "COM (NOLOCK)" após cada nome de tabela em todos os seleciona, especialmente a dinâmica escolha queridos.
  • Ele não valida / protege contra todos os tipos de opções de injeção de SQL.
  • Se o seu banco de dados for grande, prepare-se para dormir, verifique se a consulta não será eliminada após alguns minutos.
  • Ele lança alguns valores para a string, incluindo ints / bigints / smallints / tinyints. Se você não precisar deles, coloque-os nas mesmas listas de exclusão com os carimbos de data e hora na parte superior do script.
user682385
fonte
2

Recebi acesso a um banco de dados, mas não à tabela em que minha consulta estava sendo armazenada.

Inspirado por @marc_s answe r, dei uma olhada no HeidiSQL um programa do Windows que pode lidar com MySQL, SQL Server e PostgreSQL.

Descobri que ele também pode pesquisar em um banco de dados por uma string.

Clique em Pesquisar e, em seguida, em Localizar texto no servidor

Ferramenta de pesquisa aberta.  Verifique se o banco de dados está selecionado

Ele pesquisará cada tabela e fornecerá quantas vezes encontrou a sequência por tabela!

Ari
fonte
1

O conteúdo de todos os procedimentos, visualizações e funções armazenadas é armazenado no texto do campo sysComments da tabela . O nome de todos os objetos são armazenados na tabela sysObjects e as colunas estão em sysColumns .

Com essas informações, você pode usar este código para pesquisar no conteúdo de visualizações, procedimentos armazenados e funções da palavra especificada:

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

Esta consulta fornecerá os objetos que contêm a palavra "tblEmployes".

Para pesquisar pelo nome de Objetos, você pode usar este código:

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

E, finalmente, para encontrar os objetos com pelo menos uma coluna contendo a palavra "tblEmployes", você pode usar este código:

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

Você pode combinar essas três consultas com a união:

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

Com esta consulta, você tem todos os objetos que contêm a palavra "tblEmployes" no conteúdo ou no nome ou como uma coluna.

Mehdi akbari
fonte
0

Aqui está o mesmo script enviado pelo usuário l - '' '' '' '-' '' '' '' '' '' ' , mas corrigido para funcionar em um SQL que diferencia maiúsculas de minúsculas exemplo, e com algumas outras pequenas melhorias.

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
Mike
fonte
0

Aqui está como você pode pesquisar no banco de dados no Swift usando a biblioteca FMDB.

Primeiro, acesse este link e adicione-o ao seu projeto: FMDB . Quando você tiver feito isso, eis como você o faz. Por exemplo, você tem uma tabela chamada Pessoa, nome e segundo nome e deseja localizar dados pelo primeiro nome, aqui está um código para isso:

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

Então, no seu ViewController, você escreverá isso para encontrar os detalhes da pessoa que está procurando:

  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
fonte
Esta resposta (sobre SQLite) não responde à pergunta. A pergunta era sobre o SQL Server (produto da Microsoft - embora também haja culpa por escolher um nome genérico para um produto). Na página do GitHub: " FMDB v2.7 ... Este é um wrapper Objective-C em torno do SQLite "
Peter Mortensen
0

Se eu quiser encontrar onde está o que eu quero pesquisar, eu uso o seguinte:

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;
Marjol Mehalla
fonte