Làm cách nào để tìm kiếm một chuỗi trong cơ sở dữ liệu SQL Server?


121

Tôi biết là có thể, nhưng tôi không biết làm thế nào.

Tôi cần tìm kiếm cơ sở dữ liệu SQL Server cho tất cả các đề cập đến một chuỗi cụ thể.

Ví dụ: Tôi muốn tìm kiếm tất cả các bảng, dạng xem, hàm, thủ tục được lưu trữ, ... cho chuỗi "tblEaffes" (không phải dữ liệu trong bảng).

Một trong những lý do tôi cần điều này là tôi muốn loại bỏ một số bảng dữ liệu bổ sung được tạo, nhưng tôi sợ rằng chúng có thể được sử dụng ở đâu đó trong các thủ tục hoặc hàm.



1
Hy vọng điều này sẽ giúp ai đó, stackoverflow.com/questions/13174627/...
Noname

Câu trả lời:


155

Thao tác này sẽ tìm kiếm mọi cột của mọi bảng trong một cơ sở dữ liệu cụ thể. Tạo thủ tục được lưu trữ trên cơ sở dữ liệu mà bạn muốn tìm kiếm.

Mười câu hỏi SQL Server được hỏi nhiều nhất và câu trả lời của họ :

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

Để chạy nó, chỉ cần làm như sau:

exec FindMyData_string 'google', 0

Nó hoạt động tốt một cách đáng kinh ngạc !!!


param thứ 2 "precisionMatch = 0" có nghĩa là gì?
Junchen Liu

Nếu bạn nhìn vào tập lệnh, nó chỉ là một tham số được kiểm tra trong một câu lệnh trường hợp sớm để quyết định xem có nên tìm kiếm chuỗi bằng cách sử dụng 'value' hay '% value%'
Chizzle

5
Điều này chỉ trả về kết quả đầu tiên mà nó tìm thấy và không có gì khác. Có cách nào để nó trả về tất cả các phiên bản của chuỗi trong cơ sở dữ liệu không?
qroberts

1
Tôi phải lưu tập lệnh này ở đâu và tệp cần mở rộng nào để thực thi? Tôi thực hiện ở exec FindMyData_string 'google', 0đâu?
Đen

Một số cơ sở dữ liệu không phân biệt chữ hoa chữ thường, vui lòng sử dụng INFORMATION_SCHEMA.COLUMNS trên mã của bạn. Nếu không, tập lệnh này sẽ tạo ra lỗi 'tên đối tượng không hợp lệ Information_Schema'.
Fatih

59

Nếu bạn cần tìm các đối tượng cơ sở dữ liệu (ví dụ: bảng, cột và trình kích hoạt) theo tên - hãy xem công cụ Redgate Software miễn phí có tên SQL Search thực hiện điều này - nó tìm kiếm toàn bộ cơ sở dữ liệu của bạn cho bất kỳ loại chuỗi nào.

Nhập mô tả hình ảnh tại đây

Nhập mô tả hình ảnh tại đây

Đó là một công cụ tuyệt vời phải có cho bất kỳ nhà phát triển DBA hoặc cơ sở dữ liệu nào - tôi đã đề cập rằng nó hoàn toàn miễn phí để sử dụng cho bất kỳ hình thức sử dụng nào ??


25
Công cụ tốt, nhưng nó không tìm kiếm các chuỗi trong bảng
JGilmartin

2
Không tìm kiếm các hàng thực tế
LearningJrDev

8
@LearningJrDev: không - nó tìm kiếm các đối tượng cơ sở dữ liệu - bảng, dạng xem, thủ tục được lưu trữ, v.v. - theo tên. Nó KHÔNG tìm kiếm trong dữ liệu có trong các bảng - tôi chưa bao giờ khẳng định nó đã tìm kiếm!
marc_s

4
@JGilmartin Hãy để tôi trích dẫn một phần câu hỏi Tôi muốn tìm kiếm tất cả các bảng, dạng xem, hàm, thủ tục được lưu trữ, ... cho chuỗi "tblEaffes". (Không phải dữ liệu trong bảng) Nếu bạn muốn tìm kiếm dữ liệu trong bảng, bạn có ngôn ngữ T-SQL. Công cụ này rất tốt cho các tác vụ tái cấu trúc.
nemke

49

Bạn cũng có thể thử ApexSQL Search - đây là một phần bổ trợ SSMS miễn phí tương tự như SQL Search .

Nếu bạn thực sự muốn chỉ sử dụng SQL, bạn có thể muốn thử tập lệnh này:

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 Search thật tuyệt vời. Không cần tập lệnh với công cụ này.
Miguel

1
Đây là một người bạn đời giúp đỡ tuyệt vời. Đánh giá cao nó: D
miniGweek

3
Truy vấn này chỉ tìm kiếm các đối tượng. Chúng ta cần tìm kiếm một chuỗi trong tất cả các bảng hiện có.
César León

ApexSQL dù làm một công việc vĩ đại của cách cho phép bạn chọn các loại của bạn
PeterFnet

Tôi đang cố gắng tìm một chuỗi trong procs và view. SQL là hoàn hảo cho tôi. Cảm ơn bạn.
MsTapp

20

Bạn có thể xuất cơ sở dữ liệu của mình (nếu nhỏ) sang ổ cứng / máy tính để bàn và sau đó chỉ cần thực hiện tìm kiếm chuỗi thông qua chương trình tìm kiếm văn bản hoặc trình soạn thảo văn bản.


7
Đó thực sự không phải là một ý tưởng tồi.
Oliver Tappin

:) Bạn cũng có thể sử dụng một tập lệnh. Nhưng một trình soạn thảo văn bản tốt có thể làm hầu hết mọi thứ bạn cần cho một mã SQL.
Ivan Ivković

1
Và trình soạn thảo văn bản nào sẽ hài lòng khi tải nhiều GB dữ liệu?
Bohdan

Có thể là không, nhưng trong trường hợp đó, bạn có thể sử dụng công cụ tìm kiếm tệp của bên thứ ba và có những ứng dụng có thể chia tệp thành nhiều phần tùy thích.
Ivan Ivković

1
Xuất MS SQL là tệp nhị phân và do đó không thể xuất, đọc hoặc tìm kiếm bằng phương pháp bạn đã đề xuất.
Spencer Hill

17

Để lấy bảng theo tên trong SQL Server:

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

Để tìm một thủ tục được lưu trữ theo tên:

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

Để nhận tất cả các thủ tục được lưu trữ liên quan đến một bảng:

----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
Truy vấn này chỉ tìm kiếm các đối tượng. Chúng ta cần tìm kiếm một chuỗi trong tất cả các bảng hiện có.
César León

6

Thủ tục và chức năng tìm kiếm mã này nhưng không tìm kiếm trong bảng :)

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

4

Bạn có thể;

  1. Tập lệnh cơ sở dữ liệu vào một tệp duy nhất và tìm kiếm tệp cho tblEprisees bằng trình soạn thảo văn bản. Trong SQL Server Management Studio (SSMS), nhấp chuột phải vào cơ sở dữ liệu và chọn Tạo tập lệnh .
  2. Sử dụng SSMS 'View Dependencies' bằng cách nhấp chuột phải vào tblEprisees để xem những đối tượng nào khác đang phụ thuộc vào nó
  3. Sử dụng công cụ miễn phí của bên thứ ba như Tìm kiếm SQL của Redgate Software để tìm kiếm tất cả các đối tượng cơ sở dữ liệu theo tên và nội dung theo từ khóa.

# 1 âm thanh tốt. Tôi chỉ không thể chạy nó trên máy chủ vì tôi không có quyền truy cập.
bobetko

Cảm ơn. Không chắc tại sao ai đó lại cho bạn -1. Tôi đã sửa điều đó. Đã thử RedGate ... điều đó hoàn toàn làm được những gì tôi muốn.
bobetko

2

Thao tác này sẽ tìm kiếm một chuỗi trên mọi cơ sở dữ liệu:

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

Phiên bản của tôi...

Tôi đặt tên nó là "Cây kim trong đống cỏ khô" vì những lý do rõ ràng.

Nó tìm kiếm một giá trị cụ thể trong từng hàng và từng cột, không tìm kiếm tên cột, v.v.

Thực hiện tìm kiếm (tất nhiên là thay thế các giá trị cho hai biến đầu tiên):

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;

Sau đó, để xem kết quả, ngay cả khi đang thực thi, từ một cửa sổ khác, hãy thực hiện:

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;

Một vài đề cập về nó:

  • nó sử dụng con trỏ thay vì vòng lặp while chặn
  • nó có thể in tiến trình (bỏ ghi chú nếu cần)
  • nó có thể thoát sau một vài lần thử (bỏ ghi chú IF ở cuối)
  • nó hiển thị tất cả các bản ghi
  • bạn có thể tinh chỉnh nó nếu cần

KHUYẾN CÁO:

  • KHÔNG chạy nó trong môi trường sản xuất!
  • Nó là chậm . Nếu DB được truy cập bởi các dịch vụ / người dùng khác, vui lòng thêm "WITH (NOLOCK)" sau mỗi tên bảng trong tất cả các lựa chọn, đặc biệt là những lựa chọn động.
  • Nó không xác thực / bảo vệ khỏi tất cả các loại tùy chọn chèn SQL.
  • Nếu DB của bạn rất lớn, hãy chuẩn bị cho mình một giấc ngủ ngắn, đảm bảo rằng truy vấn sẽ không bị ngắt sau vài phút.
  • Nó truyền một số giá trị thành chuỗi, bao gồm ints / bigints / smallints / tinyints. Nếu bạn không cần những thứ đó, hãy đặt chúng vào cùng danh sách loại trừ với dấu thời gian ở đầu tập lệnh.

2

Tôi đã được cấp quyền truy cập vào một cơ sở dữ liệu, nhưng không phải bảng nơi truy vấn của tôi đang được lưu trữ.

Lấy cảm hứng từ @marc_s answe r, tôi đã xem qua HeidiSQL , một chương trình Windows có thể xử lý MySQL, SQL Server và PostgreSQL.

Tôi thấy rằng nó cũng có thể tìm kiếm một chuỗi trong cơ sở dữ liệu.

Nhấp vào Tìm kiếm, sau đó nhấp vào Tìm văn bản trên Máy chủ

Công cụ tìm kiếm đang mở.  Đảm bảo rằng DB được chọn

Nó sẽ tìm kiếm từng bảng và cung cấp cho bạn bao nhiêu lần nó tìm thấy chuỗi trên mỗi bảng!


1

Nội dung của tất cả các thủ tục, khung nhìn và chức năng được lưu trữ được lưu trữ trong văn bản trường của bảng sysComments . Tên của tất cả các đối tượng được lưu trữ trong bảng sysObjects và các cột nằm trong sysColumns .

Có thông tin này, bạn có thể sử dụng mã này để tìm kiếm trong nội dung của dạng xem, thủ tục được lưu trữ và hàm cho từ được chỉ định:

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

Truy vấn này sẽ cung cấp cho bạn các đối tượng có chứa từ "tblEFastes".

Để tìm kiếm theo tên của Đối tượng, bạn có thể sử dụng mã này:

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

Và cuối cùng để tìm các đối tượng có ít nhất một cột chứa từ "tblEFastes", bạn có thể sử dụng mã này:

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

Bạn có thể kết hợp ba truy vấn này với 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%'

Với truy vấn này, bạn có tất cả các đối tượng có chứa từ "tblEFastes" trong nội dung hoặc tên hoặc dưới dạng một cột.


0

Đây là tập lệnh tương tự như được gửi bởi người dùng l --''''''--------- '' '' '' '' '' '' , nhưng được sửa chữa để hoạt động trên SQL phân biệt chữ hoa chữ thường và với một số cải tiến nhỏ khác.

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

Có thể tìm kiếm các đối tượng Cơ sở dữ liệu SQL với SQL Server Management Studio (SSMS) bằng các phương pháp sau, với Tìm kiếm đối tượng SSMS: chi tiết trình khám phá đối tượng hoặc tập lệnh T-SQL như được giải thích trong phần sau:


0

Đây là cách bạn có thể tìm kiếm cơ sở dữ liệu trong Swift bằng thư viện FMDB.

Đầu tiên, hãy truy cập liên kết này và thêm nó vào dự án của bạn: FMDB . Khi bạn đã làm điều đó, thì đây là cách bạn làm điều đó. Ví dụ: bạn có một bảng được gọi là Person, bạn có firstName và secondName và bạn muốn tìm dữ liệu theo tên, đây là mã cho điều đó:

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

Sau đó, trong ViewController của bạn, bạn sẽ viết điều này để tìm thông tin chi tiết về người bạn đang tìm kiếm:

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

Câu trả lời này (về SQLite) không trả lời câu hỏi. Câu hỏi là về SQL Server (sản phẩm của Microsoft - mặc dù họ cũng đổ lỗi vì đã chọn một cái tên chung chung như vậy cho một sản phẩm). Từ trang GitHub: " FMDB v2.7 ... Đây là trình bao bọc Objective-C xung quanh SQLite "
Peter Mortensen

0

Nếu tôi muốn tìm bất cứ thứ gì tôi muốn tìm ở đâu, tôi sử dụng cái này:

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.