SQL Server 데이터베이스에서 문자열을 검색하려면 어떻게 해야 합니까?
가능하다는 건 알지만, 방법은 모르겠어요.
SQL Server 데이터베이스에서 특정 문자열에 대한 모든 언급을 검색해야 합니다.
예:모든 테이블, 뷰, 함수, 저장 프로시저에서 "tblEmployes" 문자열(테이블 내의 데이터가 아님)을 검색하려고 합니다.
제가 이것을 필요로 하는 이유 중 하나는 생성된 추가 데이터 테이블을 제거하고 싶기 때문입니다. 하지만 절차나 기능에 사용될 수도 있습니다.
특정 데이터베이스에 있는 모든 테이블의 모든 열을 검색합니다.검색할 데이터베이스에 저장 프로시저를 만듭니다.
SQL Server에서 가장 많이 묻는 10가지 질문과 답변:
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
그것은 놀라울 정도로 잘 작동합니다!!!
이름으로 데이터베이스 개체(예: 테이블, 열 및 트리거)를 찾아야 하는 경우 SQL 검색이라는 무료 Redgate 소프트웨어 도구를 확인하십시오. 이 도구는 전체 데이터베이스에서 모든 종류의 문자열을 검색합니다.


모든 DBA 또는 데이터베이스 개발자에게 매우 유용한 필수 툴입니다. 이미 어떤 종류의 용도로도 무료로 사용할 수 있다고 말씀드렸습니까?
SQL Search와 유사한 무료 SSMS 애드인인 ApexSQL Search도 사용할 수 있습니다.
SQL만 사용하려면 다음 스크립트를 사용해 보십시오.
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]
데이터베이스를 하드 드라이브/바탕 화면으로 내보낸 다음 텍스트 검색 프로그램 또는 텍스트 편집기를 통해 문자열 검색을 수행할 수 있습니다.
SQL Server에서 이름으로 테이블을 가져오는 경우:
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%'
이 코드 검색 절차 및 기능이지만 테이블에서 검색하지 않습니다 :)
SELECT name
FROM sys.all_objects
WHERE Object_definition(object_id)
LIKE '%text%'
ORDER BY name
할 수 있습니다.
- 데이터베이스를 단일 파일로 스크립팅하고 텍스트 편집기를 사용하여 tblEmployee 파일을 검색합니다.SQL Server Management Studio(SSMS)에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 Generate Scripts(스크립트 생성)를 선택합니다.
- tblEmployee(tblEmployee) 위에서 마우스 오른쪽 버튼을 클릭하여 SSMS 'View Dependencies(의존 관계 보기)'를 사용하여 종속된 다른 개체를 확인합니다.
- Redgate Software의 SQL Search와 같은 무료 타사 도구를 사용하여 이름 및 내용별로 모든 데이터베이스 개체를 키워드별로 검색할 수 있습니다.
내 버전은...
저는 명백한 이유로 그것을 "건초더미 속의 바늘"이라고 이름 지었습니다.
열 이름 등이 아닌 각 행 및 각 열에서 특정 값을 검색합니다.
검색 실행(물론 처음 두 변수의 값 대체):
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;
그런 다음 다른 창에서 실행 중에도 결과를 보려면 다음을 실행합니다.
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;
이에 대한 언급은 거의 없습니다.
- 루프 중에 차단 대신 커서를 사용합니다.
- 진행 상황을 인쇄할 수 있습니다(필요한 경우 평가).
- 몇 번의 시도 후 종료될 수 있습니다(마지막에 IF 주석을 달지 않음).
- 모든 레코드를 표시합니다.
- 필요에 따라 미세 조정할 수 있습니다.
면책 사항:
- 운영 환경에서 실행하지 마십시오!
- 느립니다.다른 서비스/사용자가 DB에 액세스하는 경우, 모든 선택 항목, 특히 동적 선택 항목의 모든 테이블 이름 뒤에 "WITH (NOLOCK)"를 추가하십시오.
- 모든 종류의 SQL 주입 옵션에 대해 유효성을 검사/보호하지는 않습니다.
- DB가 크다면 잠을 잘 준비하고 몇 분 후에 쿼리가 삭제되지 않도록 하십시오.
- ints/bigints/smallints/tinyints를 포함한 일부 값을 문자열에 캐스팅합니다.필요 없는 경우 스크립트의 맨 위에 타임스탬프가 있는 동일한 제외 목록에 배치합니다.
저장된 모든 프로시저, 보기 및 함수의 내용은 sysComment 테이블의 필드 텍스트에 저장됩니다.모든 개체의 이름은 sysObjects 테이블에 저장되고 열은 sysColumn에 저장됩니다.
이 정보를 사용하여 보기, 저장 프로시저 및 함수의 내용에서 지정된 단어를 검색할 수 있습니다.
Select b.name from syscomments a
inner join sysobjects b on a.id = b.id
where text like '%tblEmployes%'
이 쿼리는 "tblEmployes"라는 단어가 포함된 개체를 제공합니다.
Objects의 이름으로 검색하려면 다음 코드를 사용할 수 있습니다.
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%'
다음 세 가지 쿼리를 결합할 수 있습니다.
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"라는 단어가 포함된 모든 개체가 표시됩니다.
데이터베이스에는 액세스할 수 있지만 쿼리가 저장된 테이블에는 액세스할 수 없습니다.
@marc_s 답변에 영감을 받아 MySQL, SQL Server, Postgre를 다룰 수 있는 Windows 프로그램인 HeidiSQL을 보았습니다.SQL.
데이터베이스에서 문자열을 검색할 수도 있습니다.
그것은 각 테이블을 검색하고 테이블당 몇 번이나 문자열을 찾았는지 알려줄 것입니다!
모든 데이터베이스에서 문자열을 검색합니다.
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]
검색할 위치를 찾으려면 다음을 사용합니다.
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;
phpmyadmin으로 데이터베이스에서 문자열을 검색하는 것은 쉽습니다.여러 검색 옵션 중에서 선택할 수 있으며 검색 문구가 언급된 위치를 확인할 수 있습니다.
여기에는 사용자 l--'''-------------------------------------------------------------------------------------------------------------------------------------------------------------------
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
SQL Server Management Studio(SSMS)에서 개체 탐색기 세부 정보 또는 T-SQL 스크립트와 같은 SSMS 개체 검색 방법을 사용하여 SQL 데이터베이스 개체를 검색할 수 있습니다.
다음은 FMDB 라이브러리를 사용하여 Swift에서 데이터베이스를 검색하는 방법입니다.
먼저 이 링크로 이동하여 프로젝트에 추가합니다. FMDB. 작업을 완료하면 다음과 같이 작업을 수행할 수 있습니다.예를 들어, 사용자라는 테이블이 있고 이름과 이름이 있고 이름으로 데이터를 찾으려는 경우 다음 코드가 있습니다.
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()
}
}
그런 다음 View 컨트롤러에서 다음과 같이 기록하여 원하는 사용자 세부 정보를 찾습니다.
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
}
}
}
}
}
언급URL : https://stackoverflow.com/questions/9185871/how-do-i-search-an-sql-server-database-for-a-string
'programing' 카테고리의 다른 글
| 업로드 후 iOS UIIimagePickerController 결과 이미지 방향 (0) | 2023.05.09 |
|---|---|
| Azure 기능:Blob Storage Secret 저장소에서 읽기 작업을 수행하는 동안 오류가 발생했습니다. (0) | 2023.05.09 |
| Git에서 루트 커밋을 편집하시겠습니까? (0) | 2023.05.09 |
| Createuser: 데이터베이스 postgres에 연결할 수 없음: FATAL: 역할 "tom"이 존재하지 않습니다. (0) | 2023.05.09 |
| 파이썬에서 __weakref_가 정확히 무엇입니까? (0) | 2023.05.09 |
![[검색]을 누른 후 [서버에서 텍스트 찾기]를 누릅니다.](https://i.stack.imgur.com/qJCGd.png)
