Wie durchsuche ich eine SQL Server-Datenbank nach einer Zeichenfolge?

121

Ich weiß, dass es möglich ist, aber ich weiß nicht wie.

Ich muss eine SQL Server-Datenbank nach allen Erwähnungen einer bestimmten Zeichenfolge durchsuchen.

Zum Beispiel: Ich möchte alle Tabellen, Ansichten, Funktionen, gespeicherten Prozeduren usw. nach der Zeichenfolge "tblEmployes" durchsuchen (keine Daten in den Tabellen).

Einer der Gründe, warum ich dies brauche, ist, dass ich einige zusätzliche Datentabellen entfernen möchte, die erstellt wurden, aber ich befürchte, dass sie möglicherweise irgendwo in Prozeduren oder Funktionen verwendet werden.

Bobetko
quelle
6
Redgate SQL Search
Mikael Eriksson
1
Hoffe, dies wird jemandem helfen, stackoverflow.com/questions/13174627/…
NoNaMe

Antworten:

155

Dadurch wird jede Spalte jeder Tabelle in einer bestimmten Datenbank durchsucht. Erstellen Sie die gespeicherte Prozedur in der Datenbank, in der Sie suchen möchten.

Die zehn am häufigsten gestellten Fragen zu SQL Server und ihre Antworten :

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

Um es auszuführen, gehen Sie einfach folgendermaßen vor:

exec FindMyData_string 'google', 0

Es funktioniert erstaunlich gut !!!

l - '' '' '' - '' '' '' '' '' '' ''
quelle
Was bedeutet der 2. Parameter "ExactMatch = 0"?
Junchen Liu
Wenn Sie sich das Skript ansehen, ist es nur ein Parameter, der in einer case-Anweisung frühzeitig überprüft wird, um zu entscheiden, ob die Zeichenfolgensuche mit 'value' oder '% value%' durchgeführt werden soll
Chizzle
5
Dies gibt nur das erste gefundene Ergebnis zurück und sonst nichts. Gibt es eine Möglichkeit, alle Instanzen der Zeichenfolge in der Datenbank zurückzugeben?
Qroberts
1
Wo muss ich dieses Skript speichern und welche Erweiterung muss die Datei ausgeführt werden? Wo führe ich aus exec FindMyData_string 'google', 0?
Schwarz
Bei einigen Datenbanken wird nicht zwischen Groß- und Kleinschreibung unterschieden. Verwenden Sie für Ihren Code INFORMATION_SCHEMA.COLUMNS. Andernfalls gibt dieses Skript den Fehler 'Ungültiger Objektname Information_Schema' aus.
Fatih
59

Wenn Sie Datenbankobjekte (z. B. Tabellen, Spalten und Trigger) nach Namen suchen müssen - schauen Sie sich das kostenlose Redgate-Software-Tool namens SQL Search an, das dies ausführt -, durchsucht es Ihre gesamte Datenbank nach beliebigen Zeichenfolgen.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Es ist ein großartiges Must-Have-Tool für jeden DBA- oder Datenbankentwickler. Habe ich bereits erwähnt, dass es für jede Art von Verwendung absolut kostenlos ist ?

marc_s
quelle
25
Gutes Werkzeug, aber es sucht nicht nach Zeichenfolgen in Tabellen
JGilmartin
2
Sucht nicht die tatsächlichen Zeilen
LearningJrDev
8
@LearningJrDev: nein - es durchsucht die Datenbankobjekte - die Tabellen, Ansichten, gespeicherten Prozeduren usw. - nach Namen. Es sucht NICHT in den in den Tabellen enthaltenen Daten - ich habe es nie behauptet!
marc_s
4
@JGilmartin Lassen Sie mich einen Teil der Frage zitieren, nach der ich alle Tabellen, Ansichten, Funktionen, gespeicherten Prozeduren usw. nach der Zeichenfolge "tblEmployes" durchsuchen möchte. (Keine Daten in den Tabellen) Wenn Sie Daten in der Tabelle suchen möchten, haben Sie die T-SQL-Sprache. Dieses Tool eignet sich hervorragend für Refactoring-Aufgaben.
Nemke
49

Sie können auch ApexSQL Search ausprobieren - es ist ein kostenloses SSMS- Add-In, das SQL Search ähnelt .

Wenn Sie wirklich nur SQL verwenden möchten, können Sie dieses Skript ausprobieren:

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
quelle
4
ApexSQL Search ist fantastisch. Mit diesem Tool sind keine Skripte erforderlich.
Miguel
1
Dies ist eine großartige Hilfe.
Schätzen Sie
3
Diese Abfrage sucht nur nach Objekten. Wir müssen eine Zeichenfolge in allen vorhandenen Tabellen suchen.
César León
ApexSQL macht jedoch einen großartigen Job, indem Sie Ihre Typen auswählen können
PeterFnet
Ich versuche, eine Zeichenfolge in Prozessen und Ansichten zu finden. Das SQL ist perfekt für mich. Danke dir.
MsTapp
20

Sie können Ihre Datenbank (falls klein) auf Ihre Festplatte / Ihren Desktop exportieren und dann einfach eine Zeichenfolgensuche über ein Textsuchprogramm oder einen Texteditor durchführen.

Ivan Ivković
quelle
7
Das ist eigentlich keine schlechte Idee.
Oliver Tappin
:) Du könntest auch ein Skript verwenden. Ein guter Texteditor kann jedoch fast alles tun, was Sie für einen SQL-Code benötigen.
Ivan Ivković
1
Und welcher Texteditor würde gerne viele GB Daten laden?
Bohdan
Wahrscheinlich keine, aber in diesem Fall können Sie eine Dateisuchmaschine eines Drittanbieters verwenden, und es gibt Anwendungen, die die Datei in beliebig viele Teile aufteilen können.
Ivan Ivković
1
MS SQL-Exporte sind Binärdateien und können daher nicht mit der von Ihnen vorgeschlagenen Methode exportiert, gelesen oder durchsucht werden.
Spencer Hill
17

So rufen Sie eine Tabelle mit Namen in SQL Server ab:

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

So finden Sie eine gespeicherte Prozedur nach Namen:

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

So rufen Sie alle gespeicherten Prozeduren ab, die sich auf eine Tabelle beziehen:

----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
quelle
2
Diese Abfragen suchen nur nach Objekten. Wir müssen eine Zeichenfolge in allen vorhandenen Tabellen suchen.
César León
6

Diese Code- Suchprozedur und Funktion, aber nicht in der Tabelle suchen :)

SELECT name 
FROM   sys.all_objects 
WHERE  Object_definition(object_id) 
LIKE '%text%' 
ORDER BY name
Aykut Aydoğan
quelle
4

Du könntest;

  1. Schreiben Sie die Datenbank in eine einzelne Datei und durchsuchen Sie die Datei mit einem Texteditor nach tblEmployees. Klicken Sie in SQL Server Management Studio (SSMS) mit der rechten Maustaste auf die Datenbank und wählen Sie "Skripte generieren" .
  2. Verwenden Sie SSMS 'Abhängigkeiten anzeigen', indem Sie mit der rechten Maustaste auf tblEmployees klicken, um zu sehen, welche anderen Objekte davon abhängig sind
  3. Verwenden Sie ein kostenloses Drittanbieter-Tool wie die SQL-Suche von Redgate Software , um alle Datenbankobjekte nach Namen und Inhalt nach Schlüsselwörtern zu durchsuchen.
Ajayel
quelle
# 1 klingt gut. Ich kann es einfach nicht auf dem Server ausführen, da ich keine Zugriffsrechte habe.
Bobetko
Vielen Dank. Ich bin mir nicht sicher, warum dir jemand -1 gegeben hat. Ich habe das behoben. Versucht RedGate ... das macht total was ich will.
Bobetko
2

Dadurch wird in jeder Datenbank nach einer Zeichenfolge gesucht:

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

Meine Version...

Ich habe es aus offensichtlichen Gründen "Nadel im Heuhaufen" genannt.

Es wird in jeder Zeile und in jeder Spalte nach einem bestimmten Wert gesucht, nicht nach Spaltennamen usw.

Führen Sie die Suche aus (ersetzen Sie natürlich die Werte für die ersten beiden Variablen):

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;

Führen Sie dann Folgendes aus, um die Ergebnisse auch während der Ausführung in einem anderen Fenster anzuzeigen:

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;

Einige Erwähnungen dazu:

  • Es werden Cursor anstelle einer blockierenden while-Schleife verwendet
  • es kann den Fortschritt drucken (bei Bedarf auskommentieren)
  • es kann nach einigen Versuchen beendet werden (Kommentar am Ende auskommentieren)
  • Es werden alle Datensätze angezeigt
  • Sie können es nach Bedarf fein einstellen

HAFTUNGSAUSSCHLUSS:

  • Führen Sie es NICHT in Produktionsumgebungen aus!
  • Es ist langsam . Wenn andere Dienste / Benutzer auf die Datenbank zugreifen , fügen Sie nach jedem Tabellennamen in allen Auswahlen, insbesondere den dynamischen Auswahlen, "WITH (NOLOCK)" hinzu.
  • Es wird nicht gegen alle Arten von SQL-Injection-Optionen validiert / geschützt.
  • Wenn Ihre Datenbank sehr groß ist, bereiten Sie sich auf etwas Schlaf vor und stellen Sie sicher, dass die Abfrage nach einigen Minuten nicht beendet wird.
  • Es werden einige Werte in Zeichenfolgen umgewandelt, einschließlich ints / bigints / smallints / tinyints. Wenn Sie diese nicht benötigen, fügen Sie sie in die gleichen Ausschlusslisten mit den Zeitstempeln oben im Skript ein.
user682385
quelle
2

Ich erhielt Zugriff auf eine Datenbank, jedoch nicht auf die Tabelle, in der meine Abfrage gespeichert wurde.

Inspiriert von @marc_s answe r habe ich mir HeidiSQL angesehen , ein Windows-Programm, das mit MySQL, SQL Server und PostgreSQL umgehen kann.

Ich fand, dass es auch eine Datenbank nach einer Zeichenfolge durchsuchen kann.

Klicken Sie auf Suchen und dann auf Text auf Server suchen

Suchwerkzeug geöffnet.  Stellen Sie sicher, dass die Datenbank ausgewählt ist

Es durchsucht jede Tabelle und gibt an, wie oft die Zeichenfolge pro Tabelle gefunden wurde!

Ari
quelle
1

Der Inhalt aller Stored Procedures, Views und Funktionen werden im Feld gespeicherten Text der Tabelle syscomments . Der Name aller Objekte wird in der Tabelle sysObjects und die Spalten in sysColumns gespeichert .

Mit diesen Informationen können Sie diesen Code verwenden, um im Inhalt von Ansichten, gespeicherten Prozeduren und Funktionen nach dem angegebenen Wort zu suchen:

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

Diese Abfrage gibt Ihnen die Objekte, die das Wort "tblEmployes" enthalten.

Um nach dem Namen von Objekten zu suchen, können Sie diesen Code verwenden:

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

Um die Objekte mit mindestens einer Spalte zu finden, die das Wort "tblEmployes" enthält, können Sie diesen Code verwenden:

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

Sie können diese drei Abfragen mit union kombinieren:

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

Mit dieser Abfrage haben Sie alle Objekte, die das Wort "tblEmployes" in Inhalt oder Name oder als Spalte enthalten.

Mehdi akbari
quelle
0

Hier ist das gleiche Skript wie vom Benutzer l - '' '' '-' - '' '' '' '' '' '' '' , aber korrigiert, um mit SQL zu arbeiten, bei dem zwischen Groß- und Kleinschreibung unterschieden wird zum Beispiel und mit einigen anderen kleinen Verbesserungen.

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
quelle
0

So können Sie die Datenbank in Swift mithilfe der FMDB-Bibliothek durchsuchen.

Gehen Sie zunächst zu diesem Link und fügen Sie diesen Ihrem Projekt hinzu: FMDB . Wenn Sie das getan haben, dann ist hier, wie Sie es tun. Sie haben beispielsweise eine Tabelle mit dem Namen Person und Sie haben Vorname und Zweitname. Sie möchten Daten anhand des Vornamens suchen. Hier ist ein Code dafür:

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

Dann schreiben Sie dies in Ihren ViewController, um die Personendetails zu finden, nach denen Sie suchen:

  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
quelle
Diese Antwort (über SQLite) beantwortet die Frage nicht. Die Frage betraf SQL Server (Microsoft-Produkt - obwohl sie auch dafür verantwortlich sind, einen solchen generischen Namen für ein Produkt zu wählen). Von der GitHub-Seite: " FMDB v2.7 ... Dies ist ein Objective-C-Wrapper um SQLite "
Peter Mortensen
0

Wenn ich herausfinden möchte, wo sich etwas befindet, nach dem ich suchen möchte, verwende ich Folgendes:

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
quelle