Как выполнить поиск базы данных 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
И все готово.