Comment rechercher une chaîne dans une base de données SQL Server?


121

Je sais que c'est possible, mais je ne sais pas comment.

J'ai besoin de rechercher une base de données SQL Server pour toutes les mentions d'une chaîne spécifique.

Par exemple: je voudrais rechercher toutes les tables, vues, fonctions, procédures stockées, ... pour la chaîne "tblEmployes" (pas les données dans les tables).

Une des raisons pour lesquelles j'en ai besoin est que je souhaite supprimer certaines tables de données supplémentaires qui sont créées, mais je crains qu'elles ne soient utilisées quelque part dans des procédures ou des fonctions.



1
J'espère que cela aidera quelqu'un, stackoverflow.com/questions/13174627
...

Réponses:


155

Cela recherchera chaque colonne de chaque table dans une base de données spécifique. Créez la procédure stockée sur la base de données dans laquelle vous souhaitez effectuer la recherche.

Les dix questions les plus posées sur SQL Server et leurs réponses :

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

Pour l'exécuter, procédez comme suit:

exec FindMyData_string 'google', 0

Cela fonctionne incroyablement bien !!!


que signifie le 2ème paramètre "exactMatch = 0"?
Junchen Liu

Si vous regardez le script, c'est juste un paramètre qui est vérifié dans une instruction case au début pour décider s'il faut rechercher une chaîne en utilisant 'value' ou '% value%'
Chizzle

5
Cela ne renvoie que le premier résultat qu'il trouve et rien d'autre. Existe-t-il un moyen de renvoyer toutes les instances de la chaîne dans la base de données?
qroberts

1
Où dois-je enregistrer ce script et quelle extension le fichier doit-il être exécuté? Où dois-je exécuter exec FindMyData_string 'google', 0?
Black

Certaines bases de données ne sont pas sensibles à la casse, veuillez utiliser INFORMATION_SCHEMA.COLUMNS sur votre code. Sinon, ce script lancera l'erreur "Nom d'objet invalide Information_Schema".
Fatih

59

Si vous avez besoin de trouver des objets de base de données (par exemple des tables, des colonnes et des déclencheurs) par nom - jetez un œil à l' outil gratuit Redgate Software appelé SQL Search qui le fait - il recherche toute votre base de données pour tout type de chaîne.

Entrez la description de l'image ici

Entrez la description de l'image ici

C'est un excellent outil indispensable pour tout DBA ou développeur de base de données - ai-je déjà mentionné qu'il est absolument gratuit à utiliser pour tout type d'utilisation?


25
Bon outil, mais il ne recherche pas de chaînes dans les tableaux
JGilmartin

2
Ne recherche pas les lignes réelles
LearningJrDev

8
@LearningJrDev: non - il recherche les objets de la base de données - les tables, vues, procédures stockées etc. - par nom. Il ne recherche PAS dans les données contenues dans les tableaux - je ne l'ai jamais prétendu!
marc_s

4
@JGilmartin Permettez-moi de citer une partie de la question que je voudrais rechercher dans toutes les tables, vues, fonctions, procédures stockées, ... pour la chaîne "tblEmployes". (Pas de données dans les tables) Si vous souhaitez rechercher des données dans la table, vous disposez du langage T-SQL. Cet outil est idéal pour les tâches de refactorisation.
nemke

49

Vous pouvez également essayer ApexSQL Search - c'est un complément SSMS gratuit similaire à SQL Search .

Si vous voulez vraiment n'utiliser que SQL, vous pouvez essayer ce 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
La recherche ApexSQL est géniale. Pas besoin de scripts avec cet outil.
Miguel

1
C'est une aide formidable. Appréciez-le: D
miniGweek

3
Cette requête recherche uniquement des objets. Nous devons rechercher une chaîne dans toutes les tables existantes.
César León

ApexSQL fait un excellent travail en vous permettant de choisir vos types
PeterFnet

J'essaie de trouver une chaîne dans les processus et les vues. Le SQL est parfait pour moi. Je vous remercie.
MsTapp

20

Vous pouvez exporter votre base de données (si petite) sur votre disque dur / bureau, puis effectuez simplement une recherche de chaîne via un programme de recherche de texte ou un éditeur de texte.


7
Ce n'est en fait pas une mauvaise idée.
Oliver Tappin

:) Vous pouvez également utiliser un script. Mais un bon éditeur de texte peut faire presque tout ce dont vous avez besoin pour un code SQL.
Ivan Ivković

1
Et quel éditeur de texte serait heureux de charger plusieurs Go de données?
Bohdan

Probablement aucun, mais dans ce cas, vous pouvez utiliser un moteur de recherche de fichiers tiers, et il existe des applications qui peuvent diviser le fichier en autant de morceaux que vous le souhaitez.
Ivan Ivković

1
Les exportations MS SQL sont des fichiers binaires et ne peuvent donc pas être exportées, lues ou recherchées à l'aide de la méthode que vous avez proposée.
Spencer Hill

17

Pour obtenir une table par nom dans SQL Server:

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

Pour rechercher une procédure stockée par nom:

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

Pour obtenir toutes les procédures stockées liées à une table:

----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
Ces requêtes ne recherchent que des objets. Nous devons rechercher une chaîne dans toutes les tables existantes.
César León

6

Cette procédure et fonction de recherche de code mais pas de recherche dans le tableau :)

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

4

Vous pourriez;

  1. Script la base de données dans un seul fichier et recherchez le fichier tblEmployees à l'aide d'un éditeur de texte. Dans SQL Server Management Studio (SSMS), cliquez avec le bouton droit sur la base de données et choisissez Générer des scripts .
  2. Utilisez SSMS 'View Dependencies' en cliquant avec le bouton droit sur tblEmployees pour voir quels autres objets en dépendent
  3. Utilisez un outil tiers gratuit tel que SQL Search de Redgate Software pour rechercher tous les objets de base de données par nom et contenu par mot-clé.

# 1 sonne bien. Je ne peux tout simplement pas l'exécuter sur le serveur car je n'ai pas de droits d'accès.
bobetko

Merci. Je ne sais pas pourquoi quelqu'un vous a donné -1. J'ai corrigé ça. J'ai essayé RedGate ... qui fait totalement ce que je veux.
bobetko

2

Cela recherchera une chaîne sur chaque base de données:

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

Ma version ...

Je l'ai nommé «aiguille dans la botte de foin» pour des raisons évidentes.

Il recherche une valeur spécifique dans chaque ligne et chaque colonne, pas pour les noms de colonnes, etc.

Exécutez la recherche (remplacez bien sûr les valeurs des deux premières variables):

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;

Ensuite, pour afficher les résultats, même en cours d'exécution, à partir d'une autre fenêtre, exécutez:

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;

Peu de mentions à ce sujet:

  • il utilise des curseurs au lieu d'une boucle while bloquante
  • il peut imprimer la progression (décommenter si nécessaire)
  • il peut sortir après quelques tentatives (décommenter le IF à la fin)
  • il affiche tous les enregistrements
  • vous pouvez l'ajuster au besoin

AVIS DE NON-RESPONSABILITÉ:

  • NE PAS l'exécuter dans des environnements de production!
  • C'est lent . Si d'autres services / utilisateurs accèdent à la base de données, veuillez ajouter "WITH (NOLOCK)" après chaque nom de table dans toutes les sélections, en particulier les sélections dynamiques.
  • Il ne valide / protège pas contre toutes sortes d'options d'injection SQL.
  • Si votre base de données est énorme, préparez-vous à dormir, assurez-vous que la requête ne sera pas tuée après quelques minutes.
  • Il convertit certaines valeurs en chaîne, notamment ints / bigints / smallints / tinyints. Si vous n'en avez pas besoin, placez-les dans les mêmes listes d'exclusion avec les horodatages en haut du script.

2

J'ai eu accès à une base de données, mais pas à la table dans laquelle ma requête était stockée.

Inspiré par @marc_s answe r, j'ai jeté un coup d'œil à HeidiSQL, un programme Windows capable de gérer MySQL, SQL Server et PostgreSQL.

J'ai trouvé qu'il peut également rechercher une base de données pour une chaîne.

Cliquez sur Rechercher, puis sur Rechercher du texte sur le serveur

Outil de recherche ouvert.  Assurez-vous que le DB est sélectionné

Il recherchera chaque table et vous indiquera combien de fois il a trouvé la chaîne par table!


1

Le contenu de toutes les procédures, vues et fonctions stockées est stocké dans le champ texte de la table sysComments . Le nom de tous les objets est stocké dans la table sysObjects et les colonnes sont dans sysColumns .

Ayant ces informations, vous pouvez utiliser ce code pour rechercher dans le contenu des vues, des procédures stockées et des fonctions le mot spécifié:

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

Cette requête vous donnera les objets qui contiennent le mot "tblEmployes".

Pour rechercher par le nom des objets, vous pouvez utiliser ce code:

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

Et enfin pour trouver les objets ayant au moins une colonne contenant le mot "tblEmployes", vous pouvez utiliser ce code:

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

Vous pouvez combiner ces trois requêtes avec 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%'

Avec cette requête, vous avez tous les objets contenant le mot "tblEmployes" dans le contenu ou le nom ou sous forme de colonne.


0

Voici le même script que celui soumis par l'utilisateur l --''''''--------- '' '' '' '' '' ' , mais corrigé pour fonctionner sur un SQL sensible à la casse exemple, et avec quelques autres améliorations mineures.

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

Voici comment rechercher la base de données dans Swift à l'aide de la bibliothèque FMDB.

Tout d'abord, allez sur ce lien et ajoutez ceci à votre projet: FMDB . Une fois que vous avez fait cela, voici comment procéder. Par exemple, vous avez une table appelée Person, et vous avez firstName et secondName et vous souhaitez rechercher des données par prénom, voici un code pour cela:

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

Ensuite, dans votre ViewController, vous écrirez ceci pour trouver le détail de la personne que vous recherchez:

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

Cette réponse (à propos de SQLite) ne répond pas à la question. La question portait sur SQL Server (le produit de Microsoft - bien que le blâme leur incombe également d'avoir choisi un nom générique pour un produit). De la page GitHub: " FMDB v2.7 ... Ceci est un wrapper Objective-C autour de SQLite "
Peter Mortensen

0

Si je veux trouver où se trouve tout ce que je veux rechercher, j'utilise ceci:

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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.