[sql-server] SQL Server 데이터베이스에서 문자열을 검색하려면 어떻게합니까?

가능하다는 건 알지만 방법은 모르겠어요.

특정 문자열에 대한 모든 언급에 대해 SQL Server 데이터베이스를 검색해야합니다.

예 : 모든 테이블, 뷰, 함수, 저장 프로 시저 등을 검색하여 문자열 “tblEmployes”(테이블 내의 데이터 아님)를 검색하고 싶습니다.

이것이 필요한 이유 중 하나는 생성 된 추가 데이터 테이블을 제거하고 싶지만 프로시 저나 함수의 어딘가에서 사용되는 것이 두렵습니다.



답변

이것은 특정 데이터베이스에있는 모든 테이블의 모든 열을 검색합니다. 검색 할 데이터베이스에 저장 프로 시저를 만듭니다.

가장 많이 묻는 10 가지 SQL Server 질문과 답변 :

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 Search 라는 무료 Redgate 소프트웨어 도구를 살펴보십시오.이 도구는 전체 데이터베이스에서 모든 종류의 문자열을 검색합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

모든 DBA 또는 데이터베이스 개발자에게 꼭 필요한 도구입니다. 어떤 용도로도 사용할 있다고 이미 언급 했습니까 ??


답변

ApexSQL Search를 사용해 볼 수도 있습니다 . SQL Search 와 유사한 무료 SSMS 추가 기능입니다 .

정말로 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


답변

당신은 할 수 있습니다;

  1. 데이터베이스를 단일 파일로 스크립팅하고 텍스트 편집기를 사용하여 파일에서 tblEmployees를 검색합니다. 에서 SQL Server 관리 Studio (SSMS), 오른쪽 데이터베이스를 통해 버튼으로 클릭하고 스크립트를 생성합니다 .
  2. tblEmployees를 마우스 오른쪽 단추로 클릭하여 SSMS ‘종속성보기’를 사용하여 종속 된 다른 개체를 확인합니다.
  3. Redgate Software의 SQL Search 와 같은 무료 타사 도구를 사용하여 모든 데이터베이스 개체를 이름으로, 콘텐츠를 키워드로 검색합니다.