¿Cómo busco una cadena en la base de datos de SQL Server?

121

Sé que es posible, pero no sé cómo.

Necesito buscar en una base de datos de SQL Server todas las menciones de una cadena específica.

Por ejemplo: me gustaría buscar en todas las tablas, vistas, funciones, procedimientos almacenados, ... la cadena "tblEmployes" (no datos dentro de las tablas).

Una de las razones por las que necesito esto es porque me gustaría eliminar algunas tablas de datos adicionales que se crean, pero me temo que tal vez se usen en algún lugar de los procedimientos o funciones.

bobetko
fuente
66
Redgate SQL Search
Mikael Eriksson
1
Espero que esto ayude a alguien, stackoverflow.com/questions/13174627/…
NoNaMe

Respuestas:

155

Esto buscará cada columna de cada tabla en una base de datos específica. Cree el procedimiento almacenado en la base de datos en la que desea buscar.

Las diez preguntas más frecuentes sobre SQL Server y sus respuestas :

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 ejecutarlo, solo haz esto:

exec FindMyData_string 'google', 0

¡Funciona increíblemente bien!

l --''''''--------- '' '' '' '' '' ''
fuente
¿Qué significa el segundo parámetro "exactoMatch = 0"?
Junchen Liu
Si observa el script, es solo un parámetro que se verifica en una declaración de caso desde el principio para decidir si se debe buscar en cadena usando 'value' o '% value%'
Chizzle
55
Esto solo devuelve el primer resultado que encuentra y nada más. ¿Hay alguna manera de que devuelva todas las instancias de la cadena en la base de datos?
qroberts
1
¿Dónde debo guardar este script y qué extensión necesita ejecutar el archivo? ¿Dónde ejecuto exec FindMyData_string 'google', 0?
Negro
Algunas bases de datos no distinguen entre mayúsculas y minúsculas. Utilice INFORMATION_SCHEMA.COLUMNS en su código. De lo contrario, este script arrojará el error 'Nombre de objeto no válido Information_Schema'.
Fatih
59

Si necesita buscar objetos de la base de datos (por ejemplo, tablas, columnas y activadores) por nombre, eche un vistazo a la herramienta gratuita de Redgate Software llamada Búsqueda SQL que hace esto: busca en toda la base de datos cualquier tipo de cadena (s).

Ingrese la descripción de la imagen aquí

Ingrese la descripción de la imagen aquí

Es una gran herramienta imprescindible para cualquier desarrollador de bases de datos o DBA. ¿Ya mencioné que es absolutamente gratis para cualquier tipo de uso?

marc_s
fuente
25
Buena herramienta, pero no lo hace buscar cadenas en las tablas
JGilmartin
2
No busca las filas reales
LearningJrDev
8
@LearningJrDev: no : busca los objetos de la base de datos (tablas, vistas, procedimientos almacenados, etc.) por nombre. No NO Búsqueda en los datos contenidos en las tablas - Nunca pedí que lo hizo!
marc_s
44
@JGilmartin Permítanme citar parte de la pregunta que me gustaría buscar en todas las tablas, vistas, funciones, procedimientos almacenados, ... para la cadena "tblEmployes". (No datos dentro de las tablas) Si desea buscar datos dentro de la tabla, tiene lenguaje T-SQL. Esta herramienta es ideal para refactorizar tareas.
nemke
49

También puede probar ApexSQL Search : es un complemento SSMS gratuito similar a SQL Search .

Si realmente desea usar solo SQL, puede probar 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
fuente
44
ApexSQL Search es impresionante. No hay necesidad de scripts con esta herramienta.
Miguel
1
Esta es una ayuda increíble. Lo aprecio: D
miniGweek
3
Esta consulta solo busca objetos. Necesitamos buscar una cadena en todas las tablas existentes.
César León el
Sin embargo, ApexSQL hace un gran trabajo al permitirle elegir sus tipos
PeterFnet
Estoy tratando de encontrar una cadena dentro de procs y vistas. El SQL es perfecto para mí. Gracias.
MsTapp
20

Puede exportar su base de datos (si es pequeña) a su disco duro / escritorio, y luego simplemente hacer una búsqueda de cadenas a través de un programa de búsqueda de texto o editor de texto.

Ivan Ivković
fuente
77
Eso en realidad no es una mala idea.
Oliver Tappin
:) También podrías usar un script. Pero un buen editor de texto podría hacer casi cualquier cosa que necesite para un código SQL.
Ivan Ivković
1
¿Y qué editor de texto estaría encantado de cargar muchos GB de datos?
Bohdan
Probablemente ninguno, pero en ese caso puede usar un motor de búsqueda de archivos de terceros, y hay aplicaciones que pueden dividir el archivo en tantas partes como desee.
Ivan Ivković
1
Las exportaciones de MS SQL son archivos binarios y, por lo tanto, no se pueden exportar, leer o buscar utilizando el método que propuso.
Spencer Hill
17

Para obtener una tabla por nombre en SQL Server:

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

Para encontrar un procedimiento almacenado por nombre:

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

Para obtener todos los procedimientos almacenados relacionados con una tabla:

----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
fuente
2
Estas consultas solo buscan objetos. Necesitamos buscar una cadena en todas las tablas existentes.
César León el
6

Este código busca procedimiento y función pero no busca en la tabla :)

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

Tú podrías;

  1. Script de la base de datos a un solo archivo y busque tblEmployees en el archivo usando un editor de texto. En SQL Server Management Studio (SSMS), haga clic derecho sobre la base de datos y elija Generar secuencias de comandos .
  2. Use 'Ver dependencias' de SSMS haciendo clic derecho sobre tblEmployees para ver qué otros objetos dependen de él
  3. Utilice una herramienta gratuita de terceros, como la búsqueda SQL de Redgate Software para buscar todos los objetos de la base de datos por nombre y contenido por palabra clave.
ajayel
fuente
# 1 suena bien. Simplemente no puedo ejecutarlo en el servidor porque no tengo derechos de acceso.
bobetko
Gracias. No estoy seguro de por qué alguien te dio -1. Lo arreglé Intenté RedGate ... eso hace totalmente lo que quiero.
bobetko
2

Esto buscará una cadena en cada base de datos:

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

Mi version...

Lo llamé "Aguja en el pajar" por razones obvias.

Busca un valor específico en cada fila y cada columna, no para nombres de columnas, etc.

Ejecute la búsqueda (reemplace los valores para las dos primeras variables, por supuesto):

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;

Luego, para ver los resultados, incluso mientras se ejecuta, desde otra ventana, ejecute:

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;

Pocas menciones al respecto:

  • usa cursores en lugar de un bucle while de bloqueo
  • Puede imprimir el progreso (descomentar si es necesario)
  • puede salir después de algunos intentos (descomente el IF al final)
  • muestra todos los registros
  • puede ajustarlo según sea necesario

Descargos de responsabilidad:

  • ¡NO lo ejecute en entornos de producción!
  • Es lenta . Si otros servicios / usuarios acceden a la base de datos, por favor añadir "CON (NOLOCK)" después de cada nombre de tabla en todas las selecciona, especialmente la dinámica seleccionar queridos.
  • No valida / protege contra todo tipo de opciones de inyección SQL.
  • Si su base de datos es enorme, prepárese para dormir, asegúrese de que la consulta no se eliminará después de unos minutos.
  • Lanza algunos valores a la cadena, incluidos ints / bigints / smallints / tinyints. Si no los necesita, colóquelos en las mismas listas de exclusión con las marcas de tiempo en la parte superior de la secuencia de comandos.
usuario682385
fuente
2

Me dieron acceso a una base de datos, pero no a la tabla donde estaba almacenada mi consulta.

Inspirado por @marc_s answe r, eché un vistazo a HeidiSQL que es un programa de Windows que puede manejar MySQL, SQL Server y PostgreSQL.

Descubrí que también puede buscar una cadena en una base de datos.

Haga clic en Buscar, luego busque texto en el servidor

Herramienta de búsqueda abierta.  Asegúrese de que la base de datos esté seleccionada

¡Buscará en cada tabla y le dará cuántas veces encontró la cadena por tabla!

Ari
fuente
1

El contenido de todos los procedimientos almacenados, vistas y funciones se almacena en el texto de campo de la tabla sysComments . El nombre de todos los objetos se almacena en la tabla sysObjects y las columnas están en sysColumns .

Con esta información, puede usar este código para buscar en el contenido de vistas, procedimientos almacenados y funciones para la palabra especificada:

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

Esta consulta le dará los objetos que contienen la palabra "tblEmployes".

Para buscar por el nombre de Objetos, puede usar este código:

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

Y finalmente, para encontrar los objetos que tienen al menos una columna que contiene la palabra "tblEmployes", puede usar este código:

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

Puede combinar estas tres consultas 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 esta consulta, tiene todos los objetos que contienen la palabra "tblEmployes" en contenido o nombre o como una columna.

Mehdi akbari
fuente
0

Aquí está el mismo script enviado por el usuario l --''''''--------- '' '' '' '' '' '' , pero corregido para trabajar en un SQL sensible a mayúsculas y minúsculas ejemplo, y con algunas otras mejoras menores.

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
Miguel
fuente
0

Aquí es cómo puede buscar en la base de datos en Swift utilizando la biblioteca FMDB.

Primero, vaya a este enlace y agregue esto a su proyecto: FMDB . Cuando hayas hecho eso, así es como lo haces. Por ejemplo, tiene una tabla llamada Persona, y tiene nombre y segundo nombre y desea buscar datos por nombre, aquí hay un código para eso:

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

Luego, en su ViewController, escribirá esto para encontrar los detalles de la persona que está buscando:

  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
fuente
Esta respuesta (sobre SQLite) no responde la pregunta. La pregunta era sobre SQL Server (producto de Microsoft, aunque también se les culpa por elegir un nombre tan genérico para un producto). Desde la página de GitHub: " FMDB v2.7 ... Este es un contenedor de Objective-C alrededor de SQLite "
Peter Mortensen
0

Si quiero encontrar dónde está todo lo que quiero buscar, uso esto:

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
fuente