Come si cerca una stringa in un database SQL Server?


121

So che è possibile, ma non so come.

Devo cercare in un database SQL Server tutte le menzioni di una stringa specifica.

Ad esempio: vorrei cercare tutte le tabelle, viste, funzioni, stored procedure, ... per la stringa "tblEmployes" (non i dati all'interno delle tabelle).

Uno dei motivi per cui ho bisogno di questo è che vorrei rimuovere alcune tabelle di dati extra che vengono create, ma temo che possano essere utilizzate da qualche parte nelle procedure o nelle funzioni.



1
Spero che questo vi aiuterà qualcuno, stackoverflow.com/questions/13174627/...~~V~~singular~~3rd
NoName

Risposte:


155

Questo cercherà ogni colonna di ogni tabella in un database specifico. Creare la stored procedure nel database in cui si desidera eseguire la ricerca.

Le dieci domande più frequenti su SQL Server e le relative risposte :

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

Per eseguirlo, basta fare questo:

exec FindMyData_string 'google', 0

Funziona incredibilmente bene !!!


cosa significa il secondo parametro "exactMatch = 0"?
Junchen Liu

Se guardi lo script, è solo un parametro che viene controllato in un'istruzione case all'inizio per decidere se eseguire la ricerca in stringa utilizzando 'value' o '% value%'
Chizzle

5
Questo restituisce solo il primo risultato che trova e nient'altro. C'è un modo per restituire tutte le istanze della stringa nel database?
qroberts

1
Dove devo salvare questo script e quale estensione deve essere eseguito il file? Dove eseguo exec FindMyData_string 'google', 0?
Nero

Alcuni database non fanno distinzione tra maiuscole e minuscole, utilizza INFORMATION_SCHEMA.COLUMNS sul tuo codice. In caso contrario, questo script genererà l'errore "Schema_Informazioni nome oggetto non valido".
Fatih

59

Se hai bisogno di trovare oggetti di database (ad es. Tabelle, colonne e trigger) per nome, dai un'occhiata allo strumento gratuito di Redgate Software chiamato SQL Search che fa questo: cerca nell'intero database qualsiasi tipo di stringa.

Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

È un ottimo strumento indispensabile per qualsiasi DBA o sviluppatore di database: ho già detto che è assolutamente gratuito per qualsiasi tipo di utilizzo ??


25
Buon strumento, ma non cerca stringhe nelle tabelle
JGilmartin

2
Non cerca nelle righe effettive
LearningJrDev

8
@LearningJrDev: no - cerca gli oggetti del database - le tabelle, le viste, le procedure memorizzate, ecc. - per nome. Essa non cerca nei dati contenuti nelle tabelle - Non ho mai preteso lo ha fatto!
marc_s

4
@ JGilmartin Consentitemi di citare parte della domanda che vorrei cercare in tutte le tabelle, viste, funzioni, stored procedure, ... per la stringa "tblEmployes". (Non i dati all'interno delle tabelle) Se vuoi cercare i dati all'interno della tabella hai il linguaggio T-SQL. Questo strumento è ottimo per il refactoring delle attività.
nemke

49

Puoi anche provare ApexSQL Search : è un componente aggiuntivo SSMS gratuito simile a SQL Search .

Se vuoi davvero usare solo SQL potresti provare questo 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]

4
ApexSQL Search è fantastico. Non c'è bisogno di script con questo strumento.
Miguel il

1
Questo è un fantastico compagno di aiuto. Lo
apprezzo

3
Questa query cerca solo oggetti. Dobbiamo cercare una stringa in tutte le tabelle esistenti.
César León

ApexSQL però fa un ottimo lavoro permettendoti di scegliere i tuoi tipi
PeterFnet

Sto cercando di trovare una stringa all'interno di proc e visualizzazioni. L'SQL è perfetto per me. Grazie.
MsTapp

20

È possibile esportare il database (se piccolo) sul disco rigido / desktop e quindi eseguire una ricerca di stringhe tramite un programma di ricerca di testo o un editor di testo.


7
In realtà non è una cattiva idea.
Oliver Tappin

:) Potresti anche usare uno script. Ma un buon editor di testo potrebbe fare quasi tutto ciò di cui avresti bisogno per un codice SQL.
Ivan Ivković

1
E quale editor di testo sarebbe felice di caricare molti GB di dati?
Bohdan

Probabilmente nessuno, ma in tal caso puoi utilizzare un motore di ricerca di file di terze parti e ci sono applicazioni che possono dividere il file in tutte le parti che desideri.
Ivan Ivković

1
Le esportazioni MS SQL sono file binari e quindi non possono essere esportati, letti o ricercati utilizzando il metodo proposto.
Spencer Hill

17

Per ottenere una tabella per nome in SQL Server:

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

Per trovare una stored procedure in base al nome:

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

Per ottenere tutte le stored procedure relative a una tabella:

----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
Questa query cerca solo oggetti. Dobbiamo cercare una stringa in tutte le tabelle esistenti.
César León

6

Questa procedura e funzione di ricerca del codice ma non ricerca nella tabella :)

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

4

Potresti;

  1. Script il database in un singolo file e cerca tblEmployees nel file utilizzando un editor di testo. In SQL Server Management Studio (SSMS), fare clic con il pulsante destro del mouse sul database e scegliere Genera script .
  2. Usa SSMS "Visualizza dipendenze" facendo clic con il pulsante destro del mouse su tblEmployees per vedere quali altri oggetti dipendono da esso
  3. Utilizzare uno strumento gratuito di terze parti come la ricerca SQL di Redgate Software per cercare tutti gli oggetti del database per nome e il contenuto per parola chiave.

# 1 suona bene. Non riesco a eseguirlo sul server perché non ho i diritti di accesso.
bobetko

Grazie. Non sono sicuro del motivo per cui qualcuno ti ha dato -1. L'ho risolto. Ho provato RedGate ... che fa totalmente quello che voglio.
bobetko

2

Questo cercherà una stringa su ogni database:

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

La mia versione ...

L'ho chiamato "Needle in the haystack" per ovvie ragioni.

Cerca un valore specifico in ogni riga e ogni colonna, non per i nomi delle colonne, ecc.

Eseguire la ricerca (sostituire i valori per le prime due variabili ovviamente):

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;

Quindi per visualizzare i risultati, anche durante l'esecuzione, da un'altra finestra, eseguire:

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;

Poche menzioni a riguardo:

  • utilizza i cursori invece di un ciclo while di blocco
  • può stampare l'avanzamento (rimuovere il commento se necessario)
  • può uscire dopo alcuni tentativi (rimuovere il commento dall'IF alla fine)
  • mostra tutti i record
  • puoi ottimizzarlo in base alle esigenze

RINUNCE:

  • NON eseguirlo in ambienti di produzione!
  • È lento . Se il DB si accede da altri servizi / utenti, si prega di aggiungere "CON (NOLOCK)" dopo ogni nome della tabella nella tutte le seleziona, in particolare la dinamica selezionare quelli.
  • Non convalida / protegge da tutti i tipi di opzioni di SQL injection.
  • Se il tuo database è enorme, preparati a dormire un po ', assicurati che la query non venga terminata dopo pochi minuti.
  • Esegue il cast di alcuni valori su string, inclusi ints / bigints / smallints / tinyints. Se non ti servono, inseriscili negli stessi elenchi di esclusione con i timestamp nella parte superiore dello script.

2

Mi è stato concesso l'accesso a un database, ma non alla tabella in cui era stata archiviata la mia query.

Ispirato da @marc_s answe r, ho dato un'occhiata a HeidiSQL, un programma Windows in grado di gestire MySQL, SQL Server e PostgreSQL.

Ho scoperto che può anche cercare una stringa in un database.

Fare clic su Cerca, quindi su Trova testo sul server

Strumento di ricerca aperto.  Assicurati che il DB sia selezionato

Cercherà in ogni tabella e ti darà quante volte ha trovato la stringa per tabella!


1

Il contenuto di tutte le stored procedure, viste e funzioni viene memorizzato nel testo del campo della tabella sysComments . Il nome di tutti gli oggetti è memorizzato nella tabella sysObjects e le colonne sono in sysColumns .

Avendo queste informazioni, puoi usare questo codice per cercare nel contenuto di viste, stored procedure e funzioni per la parola specificata:

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

Questa query ti darà gli oggetti che contengono la parola "tblEmployes".

Per cercare per nome di Oggetti puoi usare questo codice:

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

E infine per trovare gli oggetti che hanno almeno una colonna contenente la parola "tblEmployes", puoi usare questo codice:

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

Puoi combinare queste tre query con 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%'

Con questa query hai tutti gli oggetti che contengono la parola "tblEmployes" nel contenuto o nel nome o come colonna.


0

Ecco lo stesso script inviato dall'utente l --''''''--------- '' '' '' '' '' ' , ma corretto per funzionare su un SQL sensibile al maiuscolo / minuscolo esempio, e con alcuni altri piccoli miglioramenti.

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

Ecco come cercare nel database in Swift utilizzando la libreria FMDB.

Per prima cosa, vai a questo link e aggiungilo al tuo progetto: FMDB . Quando l'hai fatto, ecco come lo fai. Ad esempio, hai una tabella chiamata Persona e hai firstName e secondName e vuoi trovare i dati per nome, ecco un codice per questo:

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

Quindi nel tuo ViewController scriverai questo per trovare i dettagli della persona che stai cercando:

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

Questa risposta (su SQLite) non risponde alla domanda. La domanda riguardava SQL Server (il prodotto di Microsoft, sebbene la colpa sia anche di loro per aver scelto un nome così generico per un prodotto). Dalla pagina GitHub: " FMDB v2.7 ... Questo è un wrapper Objective-C attorno a SQLite "
Peter Mortensen

0

Se voglio trovare dove si trova qualcosa che voglio cercare, lo uso:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.