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


121

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

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

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

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



1
누군가에게 도움이
되기를 바랍니다.

답변:


155

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

가장 많이 묻는 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

놀랍도록 잘 작동합니다 !!!


두 번째 매개 변수 "exactMatch = 0"은 무엇을 의미합니까?
Junchen Liu

스크립트를 보면 'value'또는 '% value %'를 사용하여 문자열 검색을 수행할지 여부를 결정하기 위해 초기에 case 문에서 확인되는 매개 변수
일뿐입니다.

5
이것은 찾은 첫 번째 결과 만 반환하고 다른 것은 반환하지 않습니다. 데이터베이스에있는 문자열의 모든 인스턴스를 반환하는 방법이 있습니까?
qroberts

1
이 스크립트를 어디에 저장해야하며 파일을 실행해야하는 확장자는 무엇입니까? 어디에서 실행 exec FindMyData_string 'google', 0합니까?
Black

일부 데이터베이스는 대소 문자를 구분하지 않습니다. 코드에서 INFORMATION_SCHEMA.COLUMNS를 사용하십시오. 그렇지 않으면이 스크립트는 '잘못된 개체 이름 Information_Schema'오류를 발생시킵니다.
Fatih

59

데이터베이스 개체 (예 : 테이블, 열 및 트리거)를 이름으로 찾아야하는 경우 SQL Search 라는 무료 Redgate 소프트웨어 도구를 살펴보십시오.이 도구는 전체 데이터베이스에서 모든 종류의 문자열을 검색합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

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


25
좋은 도구이지만 테이블에서 문자열을 검색하지 않습니다
JGilmartin

2
실제 행을 검색하지 않음
LearningJrDev

8
@LearningJrDev : 아니요 - 데이터베이스 개체 ( 테이블, 뷰, 저장 프로 시저 등)를 이름으로 검색합니다. 표에 포함 된 데이터를 검색 하지 않습니다 .
marc_s 2015 년

4
@JGilmartin 문자열 "tblEmployes"에 대해 모든 테이블, 뷰, 함수, 저장 프로 시저 등을 검색하고 싶은 질문의 일부를 인용하겠습니다 . (테이블 내의 데이터가 아님) 테이블 내의 데이터 를 검색하려면 T-SQL 언어가 있습니다. 이 도구는 리팩토링 작업에 적합합니다.
nemke

49

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]

4
ApexSQL 검색은 굉장합니다. 이 도구에는 스크립트가 필요하지 않습니다.
Miguel

1
이것은 멋진 도우미입니다. 감사합니다 : D
miniGweek

3
이 쿼리는 개체 만 검색합니다. 모든 기존 테이블에서 문자열을 검색해야합니다.
César León

시키기의 좋은 일을하지만 ApexSQL 당신은 당신의 유형 선택
PeterFnet

procs 및 view 내에서 문자열을 찾으려고합니다. SQL은 저에게 완벽합니다. 감사합니다.
MsTapp

20

데이터베이스 (작은 경우)를 하드 드라이브 / 데스크톱으로 내 보낸 다음 텍스트 검색 프로그램이나 텍스트 편집기를 통해 문자열 검색을 수행 할 수 있습니다.


7
그것은 실제로 나쁜 생각이 아닙니다.
Oliver Tappin 2013 년

:) 스크립트도 사용할 수 있습니다. 그러나 좋은 텍스트 편집기는 SQL 코드에 필요한 거의 모든 작업을 수행 할 수 있습니다.
Ivan Ivković 2013 년

1
그리고 어떤 텍스트 편집기가 많은 GB의 데이터를로드 할 수 있습니까?
Bohdan

아마 없을 것입니다. 그러나이 경우에는 타사 파일 검색 엔진을 사용할 수 있으며 원하는만큼 파일을 분할 할 수있는 응용 프로그램이 있습니다.
Ivan Ivković 2016 년

1
MS SQL 내보내기는 바이너리 파일이므로 제안한 방법을 사용하여 내보내거나 읽거나 검색 할 수 없습니다.
Spencer Hill

17

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

2
이 쿼리는 개체 만 검색합니다. 모든 기존 테이블에서 문자열을 검색해야합니다.
César León

6

이 코드 검색 절차 및 기능 은 표에서 검색하지 않습니다. :)

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

4

당신은 할 수 있습니다;

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

# 1은 좋은 것 같습니다. 액세스 권한이 없기 때문에 서버에서 실행할 수 없습니다.
bobetko 2012

감사. 누군가 당신에게 -1을 준 이유를 잘 모르겠습니다. 나는 그것을 고쳤다. RedGate를 사용해 보았습니다 ... 그것은 내가 원하는 것을 완전히 수행합니다.
bobetko 2012

2

모든 데이터베이스에서 문자열을 검색합니다.

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]

2

내 버전 ...

나는 명백한 이유로 그것을 "건초 더미의 바늘"이라고 명명했다.

열 이름 등이 아닌 각 행과 각 열에서 특정 값을 검색합니다.

검색을 실행합니다 (물론 처음 두 변수의 값을 바꿉니다).

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;

그것에 대해 몇 가지 언급 :

  • while 루프를 차단하는 대신 커서를 사용합니다.
  • 진행 상황을 인쇄 할 수 있습니다 (필요한 경우 주석 제거).
  • 몇 번의 시도 후에 종료 될 수 있습니다 (마지막에 IF 주석 처리 해제).
  • 그것은 모든 기록을 표시합니다
  • 필요에 따라 미세 조정할 수 있습니다.

면책 조항 :

  • 프로덕션 환경에서 실행하지 마십시오!
  • 그것은이다 느린 . DB를 다른 서비스 / 사용자가 액세스하는 경우, 제발 추가 "WITH (NOLOCK)"모든의 모든 테이블 이름을 선택 후, 특히 동적은 사람을 선택합니다.
  • 모든 종류의 SQL 주입 옵션에 대해 유효성을 검사 / 보호하지 않습니다.
  • DB가 크면 잠을 자도록 준비하고 몇 분 후에 쿼리가 종료되지 않도록하십시오.
  • ints / bigints / smallints / tinyints를 포함하여 일부 값을 문자열로 캐스팅합니다. 필요하지 않은 경우 스크립트 상단에 타임 스탬프가있는 동일한 제외 목록에 넣으십시오.

2

데이터베이스에 대한 액세스 권한이 부여되었지만 쿼리가 저장된 테이블이 아닙니다.

@marc_s answe r에서 영감을 받아 MySQL, SQL Server 및 PostgreSQL을 처리 할 수있는 Windows 프로그램 인 HeidiSQL 을 살펴 보았습니다 .

데이터베이스에서 문자열을 검색 할 수도 있음을 발견했습니다.

검색을 클릭 한 다음 서버에서 텍스트 찾기

검색 도구가 열립니다.  DB가 선택되었는지 확인

각 테이블을 검색하고 테이블 당 문자열을 찾은 횟수를 제공합니다!


1

모든 저장 프로 시저, 뷰 및 함수의 내용은 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%'

다음 세 가지 쿼리를 Union으로 결합 할 수 있습니다.

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"라는 단어가 포함 된 모든 개체가 있습니다.


0

다음은 사용자 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


0

FMDB 라이브러리를 사용하여 Swift에서 데이터베이스를 검색하는 방법은 다음과 같습니다.

먼저이 링크로 이동하여 프로젝트에 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
                }
            }
        }
    }
}

이 답변 (SQLite에 대한)은 질문에 대한 답변이 아닙니다. 질문은 SQL Server 에 관한 것이 었습니다 (Microsoft 제품-제품의 일반적인 이름을 선택하는 것도 그들에게 책임이 있습니다). GitHub 페이지에서 : " FMDB v2.7 ... 이것은 SQLite를 둘러싼 Objective-C 래퍼입니다. "
Peter Mortensen

0

검색하려는 항목이 어디에 있는지 찾으려면 다음을 사용합니다.

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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.