Jak przeszukać bazę danych SQL Server w poszukiwaniu ciągu?

121

Wiem, że to możliwe, ale nie wiem jak.

Muszę przeszukać bazę danych SQL Server pod kątem wszystkich wzmianek o określonym ciągu.

Na przykład: Chciałbym przeszukać wszystkie tabele, widoki, funkcje, procedury składowane, ... pod kątem ciągu „tblEmployes” (nie danych w tabelach).

Jednym z powodów, dla których tego potrzebuję, jest to, że chciałbym usunąć dodatkowe tabele danych, które są tworzone, ale obawiam się, że mogą one być używane gdzieś w procedurach lub funkcjach.

bobetko
źródło
6
redgate Wyszukiwanie SQL
Mikael Eriksson,
1
Mam nadzieję, że to komuś pomoże, stackoverflow.com/questions/13174627/…
NoNaMe

Odpowiedzi:

155

Spowoduje to przeszukanie każdej kolumny każdej tabeli w określonej bazie danych. Utwórz procedurę składowaną w bazie danych, w której chcesz wyszukiwać.

Dziesięć najczęściej zadawanych pytań dotyczących programu SQL Server i ich odpowiedzi :

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

Aby go uruchomić, po prostu zrób to:

exec FindMyData_string 'google', 0

Działa niesamowicie dobrze !!!

l --''''''--------- '' '' '' '' '' ''
źródło
co oznacza drugi parametr „exactMatch = 0”?
Junchen Liu
Jeśli spojrzysz na skrypt, jest to tylko parametr, który jest sprawdzany w instrukcji case na początku, aby zdecydować, czy wyszukiwać ciągi za pomocą „value”, czy „% value%”
Chizzle
5
Zwraca tylko pierwszy znaleziony wynik i nic więcej. Czy istnieje sposób na zwrócenie wszystkich wystąpień ciągu w bazie danych?
qroberts
1
Gdzie mam zapisać ten skrypt i jakie rozszerzenie musi mieć plik do wykonania? Gdzie mam wykonać exec FindMyData_string 'google', 0?
Czarny
W niektórych bazach danych wielkość liter nie jest rozróżniana. Użyj w swoim kodzie INFORMATION_SCHEMA.COLUMNS. W przeciwnym razie ten skrypt zgłosi błąd „nieprawidłowa nazwa obiektu Schemat_informacyjny”.
Fatih
59

Jeśli potrzebujesz znaleźć obiekty bazy danych (np. Tabele, kolumny i wyzwalacze) według nazwy - zapoznaj się z darmowym narzędziem Redgate Software o nazwie SQL Search, które to robi - przeszukuje całą bazę danych pod kątem dowolnego rodzaju łańcuchów.

Tutaj wprowadź opis obrazu

Tutaj wprowadź opis obrazu

To świetne narzędzie, które musi mieć każdy programista DBA lub bazy danych - czy wspomniałem już, że jest całkowicie darmowe do dowolnego użytku?

marc_s
źródło
25
Dobre narzędzie, ale nie wyszukuje łańcuchów w tabelach
JGilmartin
2
Nie przeszukuje rzeczywistych wierszy
LearningJrDev
8
@LearningJrDev: no - przeszukuje obiekty bazy danych - tabele, widoki, procedury składowane itp. - po nazwie. Robi NIE szukać w danych zawartych w tabelach - nigdy nie twierdził, że tak!
marc_s
4
@JGilmartin Pozwólcie, że zacytuję część pytania. Chciałbym przeszukać wszystkie tabele, widoki, funkcje, procedury składowane, ... w celu wyszukania ciągu „tblEmployes”. (Brak danych w tabelach) Jeśli chcesz wyszukiwać dane w tabeli, masz język T-SQL. To narzędzie doskonale nadaje się do zadań refaktoryzacji.
nemke
49

Możesz także wypróbować ApexSQL Search - jest to darmowy dodatek SSMS podobny do wyszukiwania SQL .

Jeśli naprawdę chcesz używać tylko SQL, możesz wypróbować ten skrypt:

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
źródło
4
Wyszukiwanie ApexSQL jest niesamowite. Nie ma potrzeby używania skryptów z tym narzędziem.
Miguel
1
To niesamowity towarzysz pomocy. Doceń to: D
miniGweek
3
To zapytanie wyszukuje tylko obiekty. Musimy wyszukać ciąg we wszystkich istniejących tabelach.
César León
Jednak ApexSQL wykonuje świetną robotę, pozwalając ci wybrać twoje typy
PeterFnet
Próbuję znaleźć ciąg w procesach i widokach. SQL jest dla mnie idealny. Dziękuję Ci.
MsTapp
20

Możesz wyeksportować swoją bazę danych (jeśli jest mała) na dysk twardy / pulpit, a następnie po prostu przeprowadź wyszukiwanie ciągów za pomocą programu do wyszukiwania tekstu lub edytora tekstu.

Ivan Ivković
źródło
7
To właściwie nie jest zły pomysł.
Oliver Tappin
:) Możesz też użyć skryptu. Ale dobry edytor tekstu może zrobić prawie wszystko, czego potrzebujesz do kodu SQL.
Ivan Ivković
1
A który edytor tekstu byłby szczęśliwy, gdyby załadował wiele GB danych?
Bohdan
Prawdopodobnie żaden, ale w takim przypadku możesz skorzystać z wyszukiwarki plików innej firmy, a istnieją aplikacje, które mogą podzielić plik na dowolną liczbę części.
Ivan Ivković
1
Eksport MS SQL jest plikiem binarnym i dlatego nie można go eksportować, czytać ani przeszukiwać za pomocą proponowanej metody.
Spencer Hill
17

Aby uzyskać tabelę według nazwy w programie SQL Server:

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

Aby znaleźć procedurę składowaną według nazwy:

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

Aby uzyskać wszystkie procedury składowane związane z tabelą:

----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
źródło
2
To zapytania wyszukują tylko obiekty. Musimy wyszukać ciąg we wszystkich istniejących tabelach.
César León
6

Ta procedura i funkcja wyszukiwania kodu, ale bez wyszukiwania w tabeli :)

SELECT name 
FROM   sys.all_objects 
WHERE  Object_definition(object_id) 
LIKE '%text%' 
ORDER BY name
aykut aydoğan
źródło
4

Mógłbyś;

  1. Skrypt bazy danych do pojedynczego pliku i wyszukaj plik tblEmployees za pomocą edytora tekstu. W SQL Server Management Studio (SSMS) kliknij prawym przyciskiem myszy bazę danych i wybierz opcję Generuj skrypty .
  2. Użyj opcji „Wyświetl zależności” SSMS, klikając prawym przyciskiem myszy tblEmployees, aby zobaczyć, które inne obiekty są od niego zależne
  3. Skorzystaj z bezpłatnego narzędzia innej firmy, takiego jak wyszukiwanie SQL firmy Redgate, aby przeszukać wszystkie obiekty bazy danych według nazwy i zawartości według słów kluczowych.
ajayel
źródło
# 1 brzmi dobrze. Po prostu nie mogę go uruchomić na serwerze, ponieważ nie mam praw dostępu.
bobetko
Dzięki. Nie wiem, dlaczego ktoś dał ci -1. Naprawiłem to. Wypróbowałem RedGate ... to całkowicie spełnia moje oczekiwania.
bobetko
2

Spowoduje to wyszukanie ciągu w każdej bazie danych:

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
źródło
2

Moja wersja ...

Nazwałem ją „Igła w stogu siana” z oczywistych powodów.

Wyszukuje określoną wartość w każdym wierszu i każdej kolumnie, a nie nazw kolumn itp.

Wykonaj wyszukiwanie (oczywiście zamień wartości dla pierwszych dwóch zmiennych):

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;

Następnie, aby wyświetlić wyniki, nawet podczas wykonywania, z innego okna, wykonaj:

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;

Niewiele o tym wspomina:

  • używa kursorów zamiast blokującej pętli while
  • może wydrukować postęp (w razie potrzeby odkomentować)
  • może wyjść po kilku próbach (odkomentować IF na końcu)
  • wyświetla wszystkie rekordy
  • w razie potrzeby możesz go dostroić

ZASTRZEŻENIA:

  • NIE uruchamiaj go w środowiskach produkcyjnych!
  • Jest powolny . Jeśli do bazy danych uzyskują dostęp inne usługi / użytkownicy, należy dodać „WITH (NOLOCK)” po każdej nazwie tabeli we wszystkich selekcjach, zwłaszcza dynamicznych.
  • Nie sprawdza poprawności ani nie chroni przed wszelkiego rodzaju opcjami wstrzykiwania SQL.
  • Jeśli twoja DB jest ogromna, przygotuj się na sen, upewnij się, że zapytanie nie zostanie zabite po kilku minutach.
  • Rzuca niektóre wartości na łańcuch, w tym ints / bigints / smallints / tinyints. Jeśli ich nie potrzebujesz, umieść je na tych samych listach wykluczeń z sygnaturami czasowymi u góry skryptu.
user682385
źródło
2

Otrzymałem dostęp do bazy danych, ale nie do tabeli, w której było przechowywane moje zapytanie.

Zainspirowany @marc_s answe r, przyjrzałem się HeidiSQL który jest programem Windows, który radzi sobie z MySQL, SQL Server i PostgreSQL.

Odkryłem, że może również przeszukiwać bazę danych pod kątem ciągu.

Kliknij Szukaj, a następnie Znajdź tekst na serwerze

Narzędzie wyszukiwania otwarte.  Upewnij się, że wybrano bazę danych

Przeszuka każdą tabelę i poda, ile razy znalazł ciąg w każdej tabeli!

Ari
źródło
1

Zawartość wszystkich procedur składowanych, widoków i funkcji jest przechowywana w polu tekstowym tabeli sysComments . Nazwy wszystkich obiektów są przechowywane w tabeli sysObjects, a kolumny w sysColumns .

Mając te informacje, możesz użyć tego kodu do wyszukiwania w zawartości widoków, procedur składowanych i funkcji dla określonego słowa:

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

To zapytanie da ci obiekty, które zawierają słowo „tblEmployes”.

Aby wyszukiwać według nazwy obiektów, możesz użyć tego kodu:

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

I wreszcie, aby znaleźć obiekty mające co najmniej jedną kolumnę zawierającą słowo „tblEmployes”, możesz użyć tego kodu:

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

Możesz połączyć te trzy zapytania za pomocą unii:

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

Za pomocą tego zapytania masz wszystkie obiekty zawierające słowo „tblEmployes” w treści, nazwie lub w kolumnie.

Mehdi akbari
źródło
0

Oto ten sam skrypt, który został przesłany przez użytkownika l --''''''--------- '' '' '' '' '' '' , ale poprawiony, aby działał na SQL z rozróżnianiem wielkości liter przykład i kilka innych drobnych ulepszeń.

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
Mikrofon
źródło
0

Oto, jak możesz przeszukiwać bazę danych w Swift przy użyciu biblioteki FMDB.

Najpierw przejdź do tego linku i dodaj do swojego projektu: FMDB . Kiedy to zrobisz, oto jak to zrobić. Na przykład masz tabelę o nazwie Osoba, masz firstName i secondName i chcesz znaleźć dane według imienia, oto kod do tego:

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

Następnie w swoim ViewController napiszesz to, aby znaleźć szczegółową osobę, której szukasz:

  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
źródło
Ta odpowiedź (dotycząca SQLite) nie odpowiada na pytanie. Pytanie dotyczyło SQL Servera (produkt Microsoftu - choć oni również ponoszą winę za wybranie tak ogólnej nazwy dla produktu). Ze strony GitHub: FMDB v2.7 ... To jest opakowanie Objective-C wokół SQLite
Peter Mortensen
0

Jeśli chcę dowiedzieć się, gdzie jest wszystko, czego szukam, używam tego:

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
źródło