Как выполнить поиск базы данных SQL Server для строки?

Я знаю, что это возможно, но не знаю, как это сделать.

Мне нужно найти базу данных Microsoft SQL для всех упоминаний конкретной строки. Например: я хотел бы искать все таблицы, представления, функции, хранимые процедуры,... для строки "tblEmployes". (Не данные в таблицах)

Одна из причин, по которой мне это нужно, я хотел бы удалить некоторые дополнительные таблицы данных, которые были созданы, но я боюсь, что они, возможно, используются где-то в процедурах или функциях.

Любая помощь приветствуется.

Ответ 1

это будет искать каждый столбец каждой таблицы в конкретной базе данных. создайте сохраненную копию в базе данных, в которую вы хотите выполнить поиск.

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

чтобы запустить его, просто выполните следующее:

exec FindMyData_string 'google', 0

работает удивительно хорошо.

Ответ 2

Если вам нужно найти объекты базы данных (например, таблицы, столбцы, триггеры) по имени - посмотрите на инструмент БЕСПЛАТНО Red-Gate, называемый SQL Search, который делает это - он ищет всю вашу базу данных для любых строк (строк).

enter image description here

enter image description here

Это отличный инструмент для любого разработчика базы данных или базы данных - я уже упоминал об этом абсолютно БЕСПЛАТНО для использования любого вида использования

Ответ 3

Вы также можете попробовать ApexSQL Search - его бесплатный SSMS добавить в аналогичный SQL Search.

Если вы действительно хотите использовать только sql, вы можете попробовать этот 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

Для получения таблицы по имени в sql-сервере:

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

для поиска хранимой процедуры по имени:

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

чтобы получить все хранимые процедуры, связанные с таблицей:

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

Ответ 5

Вы можете экспортировать свою базу данных (если она небольшая) на жесткий диск/рабочий стол, а затем просто выполнить поиск строки с помощью программы текстового поиска или текстового редактора.

Ответ 6

Эта процедура и функция поиска кода, но не поиск в таблице:)

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

Ответ 7

вы могли бы;

  • Script база данных в один файл и поиск файла для tblEmployees с использованием текста редактор. В SQL Server Management Tools (SSMS) щелкните правой кнопкой мыши по базе данных и выберите "Сгенерировать скрипты".
  • Используйте SSID "Зависимости от просмотра", щелкнув правой кнопкой мыши по tblEmployees, чтобы узнать, какие другие объекты зависят от него.
  • Используйте бесплатный сторонний инструмент, такой как RedGate SQLSearch, для поиска всех объектов базы данных по имени и по ключевому слову.

Ответ 8

Это приведет к поиску строки по каждой базе данных:

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]

Ответ 9

Старый вопрос, я знаю, но здесь идет моя версия... Я назвал его "Игла в стоге сена" по понятным причинам.

Он ищет конкретное значение в каждой строке и каждом столбце, а не для имен столбцов и т.д.

Выполнить поиск (замените значения для первых двух переменных, конечно):

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;

Затем для просмотра результатов, даже при выполнении, из другого окна выполните:

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;

Немногие говорят об этом:

  • он использует курсоры вместо блокировки while
  • он может печатать ход (раскомментируйте, если необходимо)
  • он может выйти после нескольких попыток (раскомментировать IF в конце)
  • отображает все записи
  • вы можете настроить его по мере необходимости

ОТКАЗЫ:

  • НЕ запускайте его в производственных средах!
  • МЕДЛЕННО. Если к БД обращаются другие службы/пользователи, ПОЖАЛУЙСТА добавьте "WITH (NOLOCK)" после каждого имени таблицы во всех выбранных, особенно динамических, выберите.
  • Он не проверяет и не защищает все варианты SQL-инъекций.
  • Если ваша БД огромна, подготовьтесь к некоторому сну, убедитесь, что запрос не будет убит через несколько минут.
  • Он передает некоторые значения в строку, включая ints/bigints/smallints/tinyints. Если вам это не нужны, поместите их в те же списки исключений с отметками времени в верхней части script.

Надеюсь, что это поможет.

Ответ 10

Был предоставлен доступ к базе данных, но не к таблице, в которой хранился мой запрос.

Вдохновленный ответом @marc_s, я взглянул на HeidiSQL, который является программой Windows, которая может работать с MySQL, MSSQL и PostgreSQL.

Обнаружено, что он также может искать базу данных для строки.

Нажмите

Инструмент поиска открыт. Убедитесь, что выбран БД

Он будет искать в каждой таблице и сколько раз вы найдете строку в таблице!

Ответ 11

Содержимое всех хранимых процедур, представлений и функций хранится в текстовом поле таблицы sysComments. Имена всех объектов хранятся в таблице sysObjects, а столбцы - в sysColumns.

Имея эту информацию, вы можете использовать этот код для поиска в содержании представлений, хранимых процедур и функций по указанному слову:

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

Этот запрос даст вам объекты, которые содержат слово "tblEmployes".

Для поиска по названию объектов вы можете использовать этот код:

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

и, наконец, чтобы найти объекты, имеющие хотя бы один столбец, содержащий слово "tblEmployes", используйте этот код:

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

Вы можете объединить эти 3 запроса с объединением:

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

С этим запросом у вас есть все объекты, содержащие слово "tblEmployes" в содержании или имени или в виде столбца.

Ответ 12

Вот тот же сценарий, который был представлен пользователем l-- '' '' '' --------- '' '' '' '' '' '', но исправлен для работы с чувствительным к регистру SQL например, и с некоторыми другими незначительными улучшениями.

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

Ответ 13

Поиск объектов базы данных SQL возможен с помощью SQL Server Management Studio следующими методами, с помощью поиска объектов SSMS: сведения об обозревателе объектов или сценарии T-SQL, как описано ниже:

Ответ 14

Здесь Как вы можете искать в базе данных в Swift с помощью библиотеки FMDB Сначала перейдите по этой ссылке и добавьте ее в свой проект FMDB Когда вы это сделали, то здесь Как вы это делаете, например, у вас есть таблица с именем Person и у вас firstName и secondName, и вы хотите найти данные по имени. Вот код для этого

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

Затем в вашем ViewController вы напишите это, чтобы найти нужную вам личность

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

Ответ 15

Если я хочу найти то, что я хочу найти,  я использую это:

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;

Ответ 16

Предположим, вы не будете делать общий поиск в целом базе данных, и вы просто хотите найти ключевое слово самостоятельно, это самое простое, более чистое и быстрое решение.

  • Дамп вашей базы данных в файл.

    $ mysqldump -u root -p your_database > your_database.sql
    
  • Сделайте grep в этом файле

    $ grep 'keyword' your_database.sql
    

И все готово.