it-swarm.com.de

Wie durchsucht man die SQL Server-Datenbank nach String?

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

Ich muss in der Microsoft SQL-Datenbank nach allen Erwähnungen eines bestimmten Strings suchen. Beispiel: Ich möchte alle Tabellen, Ansichten, Funktionen, gespeicherten Prozeduren, ... nach dem String "tblEmployes" durchsuchen. (Keine Daten innerhalb der Tabellen)

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

Jede Hilfe wird geschätzt.

90
bobetko

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

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#2 :

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, mach einfach folgendes:

exec FindMyData_string 'google', 0

funktioniert erstaunlich gut !!!

Wenn Sie Datenbankobjekte (z. B. Tabellen, Spalten, Trigger) anhand des Namens suchen müssen, werfen Sie einen Blick auf das FREE Red-Gate-Tool namens SQL Search . Dabei wird die gesamte Datenbank durchsucht für jede Art von String (s).

enter image description here

enter image description here

Es ist ein großartiges Muss für jeden DBA- oder Datenbank-Entwickler. Habe ich bereits erwähnt, dass es absolut FREE ist, um für jede Art von Verwendung verwendet zu werden?

56
marc_s

Sie können auch ApexSQL Search - versuchen - Es handelt sich um ein kostenloses SSMS-Add-In, ähnlich wie bei der SQL-Suche. 

Wenn Sie wirklich nur SQL verwenden möchten, sollten 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]
45
George Ober

Um eine Tabelle nach Namen in SQL Server zu erhalten:

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

um eine gespeicherte Prozedur anhand des Namens zu finden:

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

um alle gespeicherten Prozeduren zu erhalten, 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%'
16
TheBoyan

Sie können Ihre Datenbank (wenn auch klein) auf Ihre Festplatte/Ihren Desktop exportieren. Dann führen Sie einfach eine Suche mit dem Texteditor durch.

14
Ivan Ivković

Dieser Code Suchvorgang und Funktion, aber nicht in der Tabelle suchen :)

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

du könntest;

  1. Skriptieren Sie die Datenbank in eine einzige Datei und durchsuchen Sie die Datei mit einem Texteditor Nach tblEmployees. Klicken Sie in SQL Server-Verwaltungstools (SSMS) mit der rechten Maustaste auf die Datenbank und wählen Sie "Skripts erstellen". 
  2. Verwenden Sie SSMS 'View Dependancies', indem Sie mit der rechten Maustaste auf tblEmployees klicken, um zu sehen, welche anderen Objekte davon abhängig sind
  3. Verwenden Sie ein kostenloses Tool von Drittanbietern wie RedGate SQLSearch, um alle Datenbankobjekte nach Namen und Inhalt nach Schlüsselwörtern zu durchsuchen. 
3
ajayel

Dadurch wird über jede Datenbank nach einem String 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 ''%'[email protected]_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
kinzleb

Alte Frage, ich weiß, aber hier ist meine Version ... Ich habe sie aus offensichtlichen Gründen als "Nadel im Heuhaufen" bezeichnet.

Es sucht nach bestimmten Werten in jeder Zeile und jeder Spalte, nicht nach Spaltennamen usw.

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

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 [email protected]_DB AND DATA_TYPE NOT IN ('timestamp', 'datetime');

DECLARE @TOTAL int = (SELECT COUNT(*)
FROM information_schema.columns WHERE [email protected]_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+'.'[email protected]_SCHEMA+'.'[email protected]_NAME+': '[email protected]_NAME+' ('[email protected]_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 '''[email protected]_CATALOG+''' catalog_name, '''[email protected]_SCHEMA+''' schema_name, '''[email protected]_NAME+''' table_name, '''[email protected]_NAME+''' column_name, '''[email protected]_TYPE+''' data_type, ' + 
            +' COUNT(['[email protected]_NAME+']) records '+
            +' FROM '[email protected]_CATALOG+'.'[email protected]_SCHEMA+'.'[email protected]_NAME +
            +' WHERE ' + CASE WHEN @SHOULD_CAST=1 THEN 'CAST(['[email protected]_NAME + '] as NVARCHAR(max)) ' ELSE ' ['[email protected]_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 @[email protected]+1
    -- IF @i > 1000
    --  BREAK
END   
CLOSE col_cur;  
DEALLOCATE col_cur;

SELECT * FROM ##RESULTS WHERE RECORDS>0;

Führen Sie dann zur Anzeige der Ergebnisse, auch während der Ausführung, aus einem anderen Fenster aus Folgendes aus:

DECLARE @SEARCH_VALUE_LIKE NVARCHAR(100)=N'%@[email protected]%'
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 '''[email protected]_CATALOG+''' catalog_name, '''[email protected]_SCHEMA+''' schema_name, '''[email protected]_NAME+''' table_name, '''[email protected]_NAME+''' column_name, '''[email protected]_TYPE+''' data_type, ' + 
            +' ['[email protected]_NAME+']'+
            +', * '
            +' FROM '[email protected]_CATALOG+'.'[email protected]_SCHEMA+'.'[email protected]_NAME +
            +' WHERE ' + CASE WHEN @SHOULD_CAST=1 THEN 'CAST(['[email protected]_NAME + '] as NVARCHAR(max)) ' ELSE ' ['[email protected]_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 @[email protected]+1
    -- IF @i > 10
    --  BREAK
END   
CLOSE col_cur;  
DEALLOCATE col_cur;

Einige Erwähnungen dazu:

  • statt einer blockierenden While-Schleife werden Cursor verwendet
  • es kann den Fortschritt drucken (unkommentiert wenn nötig)
  • es kann nach einigen Versuchen beendet werden (kommentieren Sie die IF am Ende)
  • es zeigt alle Datensätze an
  • sie können es nach Bedarf fein abstimmen

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 Auswahllisten "WITH (NOLOCK)" hinzu, insbesondere die dynamischen Auswahlnamen.
  • Es validiert/schützt nicht vor allen möglichen SQL-Injection-Optionen.
  • Wenn Ihre Datenbank sehr groß ist, bereiten Sie sich auf etwas Schlaf vor. Stellen Sie sicher, dass die Abfrage nicht nach einigen Minuten beendet wird.
  • Es wandelt einige Werte in Zeichenketten um, einschließlich ints/bigints/smallints/tinyints. Wenn Sie diese nicht benötigen, setzen Sie sie in die gleiche Ausschlussliste mit den Zeitstempeln oben im Skript.

Hoffe das hilft.

2
user682385

Es wurde Zugriff auf eine Datenbank gewährt, jedoch nicht auf die Tabelle, in der meine Abfrage gespeichert wurde.

Inspiriert durch die Antwort von @marc_ schaute ich auf HeidiSQL , ein Windows-Programm, das mit MySQL, MSSQL und PostgreSQL umgehen kann. 

Gefunden, dass es auch eine Datenbank nach einem String durchsuchen kann.

 Click Search, then Find text on Server

 Search tool open. Make sure the DB is selected

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

1
Ari

Das Durchsuchen von SQL-Datenbankobjekten ist mit SQL Server Management Studio mit den folgenden Methoden möglich, mit der SSMS-Objektsuche: Objekt-Explorer-Details oder T-SQL-Skripts, wie im Folgenden beschrieben: 

0
Orhan Celik

Hier Wie Sie eine Datenbank in Swift mit der FMDB-Bibliothek durchsuchen können Gehen Sie zuerst auf diesen Link und fügen Sie diesen zu Ihrem Projekt hinzu. FMDB Wenn Sie das getan haben, dann hier. Wie Sie es zum Beispiel tun, haben Sie eine Tabelle mit dem Namen Person und Sie haben den Vornamen und secondName und Sie möchten Daten nach Vorname 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 Ihrem 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 
                }
            }
        }
    }  
}
0
hardiBSalih

Hier ist dasselbe Skript, das vom Benutzer l - '' '' '' '' '' '' '' '' 'gesendet wurde, aber korrigiert wurde, um mit einer case-sensitive SQL zu arbeiten Beispiel und mit einigen anderen kleineren 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
0
Mike

Der Inhalt aller gespeicherten Prozeduren, Ansichten und Funktionen wird im Feld Text der Tabelle sysComments gespeichert. Die Namen aller Objekte werden in der Tabelle sysObjects gespeichert und die Spalten in sysColumns

Mit diesen Informationen können Sie diesen Code verwenden, um den Inhalt von Ansichten, gespeicherten Prozeduren und Funktionen nach dem angegebenen Word zu durchsuchen:

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 zu finden, die mindestens eine Spalte mit dem Wort "tblEmployes" enthalten, können Sie folgenden 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 verbinden:

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" im Inhalt oder Namen oder als Spalte enthalten.

0
Mehdi akbari