Bagaimana cara mencari string di database SQL Server?

121

Saya tahu itu mungkin, tapi saya tidak tahu caranya.

Saya perlu mencari database SQL Server untuk semua penyebutan string tertentu.

Misalnya: Saya ingin mencari semua tabel, tampilan, fungsi, prosedur tersimpan, ... untuk string "tblEmployes" (bukan data dalam tabel).

Salah satu alasan saya memerlukan ini adalah saya ingin menghapus beberapa tabel data tambahan yang dibuat, tetapi saya khawatir tabel tersebut mungkin digunakan di suatu tempat dalam prosedur atau fungsi.

bobetko
sumber
6
redgate SQL Search
Mikael Eriksson
1
Semoga ini bisa membantu seseorang, stackoverflow.com/questions/13174627/…
NoNaMe

Jawaban:

155

Ini akan mencari setiap kolom dari setiap tabel dalam database tertentu. Buat prosedur tersimpan di database yang ingin Anda cari.

Sepuluh Pertanyaan SQL Server Yang Paling Banyak Diajukan Dan Jawabannya :

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

Untuk menjalankannya, lakukan ini:

exec FindMyData_string 'google', 0

Ini bekerja dengan sangat baik !!!

l --''''''--------- '' '' '' '' '' ''
sumber
apa arti param kedua "exactMatch = 0"?
Junchen Liu
Jika Anda melihat skrip itu hanya parameter yang diperiksa dalam pernyataan kasus sejak awal untuk memutuskan apakah akan mencari string menggunakan 'value' atau '% value%'
Chizzle
5
Ini hanya mengembalikan hasil pertama yang ditemukannya dan tidak ada yang lain. Apakah ada cara untuk mengembalikan semua contoh string dalam database?
qroberts
1
Di mana saya harus menyimpan skrip ini dan ekstensi apa yang diperlukan file tersebut untuk dijalankan? Di mana saya mengeksekusi exec FindMyData_string 'google', 0?
Hitam
Beberapa database tidak peka huruf besar-kecil, gunakan INFORMATION_SCHEMA.COLUMNS pada kode Anda. Jika tidak, skrip ini akan menampilkan kesalahan 'nama objek Information_Schema' tidak valid.
Fatih
59

Jika Anda perlu menemukan objek basis data (misalnya tabel, kolom, dan pemicu) berdasarkan nama - lihat alat Perangkat Lunak Redgate gratis yang disebut Pencarian SQL yang melakukan ini - alat ini mencari seluruh basis data Anda untuk semua jenis string.

Masukkan deskripsi gambar di sini

Masukkan deskripsi gambar di sini

Ini adalah alat hebat yang harus dimiliki untuk DBA atau pengembang basis data - apakah saya sudah menyebutkan bahwa ini benar-benar gratis untuk digunakan untuk semua jenis penggunaan ??

marc_s
sumber
25
Alat yang bagus, tetapi tidak mencari string dalam tabel
JGilmartin
2
Tidak mencari baris yang sebenarnya
LearningJrDev
8
@LearningJrDev: tidak - ini mencari objek database - tabel, tampilan, prosedur tersimpan, dll. - berdasarkan nama. Itu TIDAK mencari dalam data yang terdapat dalam tabel - saya tidak pernah mengklaimnya!
marc_s
4
@JGilmartin Izinkan saya mengutip bagian dari pertanyaan saya ingin mencari semua tabel, tampilan, fungsi, prosedur tersimpan, ... untuk string "tblEmployes". (Bukan data di dalam tabel) Jika Anda ingin mencari data di dalam tabel, Anda memiliki bahasa T-SQL. Alat ini sangat bagus untuk tugas refactoring.
nemke
49

Anda juga dapat mencoba Pencarian ApexSQL - ini adalah add-in SSMS gratis yang mirip dengan Pencarian SQL .

Jika Anda benar-benar hanya ingin menggunakan SQL, Anda mungkin ingin mencoba skrip ini:

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]
George Ober
sumber
4
Pencarian ApexSQL luar biasa. Tidak perlu skrip dengan alat ini.
Miguel
1
Ini adalah teman bantuan yang luar biasa. Menghargai itu: D
miniGweek
3
Kueri ini hanya mencari objek. Kita perlu mencari string di semua tabel yang ada.
César León
ApexSQL melakukan pekerjaan yang bagus untuk membiarkan Anda memilih jenis Anda
PeterFnet
Saya mencoba menemukan string dalam procs dan views. SQL sangat cocok untuk saya. Terima kasih.
MsTapp
20

Anda dapat mengekspor database Anda (jika kecil) ke hard drive / desktop Anda, dan kemudian lakukan pencarian string melalui program pencarian teks atau editor teks.

Ivan Ivković
sumber
7
Itu sebenarnya bukan ide yang buruk.
Oliver Tappin
:) Anda juga bisa menggunakan skrip. Tetapi editor teks yang baik dapat melakukan hampir semua hal yang Anda perlukan untuk kode SQL.
Ivan Ivković
1
Dan editor teks mana yang dengan senang hati memuat banyak GB data?
Bohdan
Mungkin tidak ada, tetapi dalam hal ini Anda dapat menggunakan mesin pencari file pihak ketiga, dan ada aplikasi yang dapat membagi file menjadi sebanyak mungkin bagian yang Anda inginkan.
Ivan Ivković
1
Ekspor MS SQL adalah file biner dan oleh karena itu tidak dapat diekspor, dibaca atau dicari menggunakan metode yang Anda usulkan.
Spencer Hill
17

Untuk mendapatkan tabel dengan nama di SQL Server:

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

Untuk menemukan prosedur tersimpan dengan nama:

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

Untuk mendapatkan semua prosedur tersimpan yang terkait dengan tabel:

----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%'
TheBoyan
sumber
2
Kueri ini hanya mencari objek. Kita perlu mencari string di semua tabel yang ada.
César León
6

Prosedur dan fungsi pencarian kode ini tetapi tidak mencari di tabel :)

SELECT name 
FROM   sys.all_objects 
WHERE  Object_definition(object_id) 
LIKE '%text%' 
ORDER BY name
aykut aydoğan
sumber
4

Anda bisa;

  1. Skrip database ke satu file dan cari file untuk tblEmployees menggunakan editor teks. Di SQL Server Management Studio (SSMS), klik kanan di atas database dan pilih Hasilkan Skrip .
  2. Gunakan SSMS 'View Dependencies' dengan mengklik kanan pada tblEmployees untuk melihat objek lain mana yang bergantung padanya
  3. Gunakan alat pihak ketiga gratis seperti Pencarian SQL Perangkat Lunak Redgate untuk mencari semua objek database dengan nama dan konten dengan kata kunci.
ajayel
sumber
# 1 terdengar bagus. Saya tidak bisa menjalankannya di server karena saya tidak memiliki hak akses.
bobetko
Terima kasih. Tidak yakin mengapa seseorang memberi Anda -1. Saya memperbaikinya. Mencoba RedGate ... benar-benar melakukan apa yang saya inginkan.
bobetko
2

Ini akan mencari string di setiap database:

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]
kinzleb
sumber
2

Versi saya ...

Saya menamakannya "Jarum di tumpukan jerami" karena alasan yang jelas.

Ini mencari nilai tertentu di setiap baris dan setiap kolom, bukan untuk nama kolom, dll.

Jalankan pencarian (tentu saja mengganti nilai untuk dua variabel pertama):

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;

Kemudian untuk melihat hasil, bahkan saat menjalankan, dari jendela lain, jalankan:

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;

Beberapa menyebutkan tentang itu:

  • itu menggunakan kursor daripada memblokir sementara loop
  • itu dapat mencetak kemajuan (hapus komentar jika diperlukan)
  • itu bisa keluar setelah beberapa upaya (hapus komentar IF di akhir)
  • itu menampilkan semua catatan
  • Anda dapat menyetelnya sesuai kebutuhan

PENAFIAN:

  • JANGAN menjalankannya di lingkungan produksi!
  • Ini lambat . Jika DB diakses oleh layanan lain / pengguna, silakan tambahkan "DENGAN (NOLOCK)" setelah setiap nama tabel di semua memilih, terutama dinamis pilih yang.
  • Itu tidak memvalidasi / melindungi dari semua jenis opsi injeksi SQL.
  • Jika DB Anda besar, persiapkan diri Anda untuk tidur, pastikan kueri tidak akan terhenti setelah beberapa menit.
  • Ini memberikan beberapa nilai ke string, termasuk ints / bigints / smallints / tinyints. Jika Anda tidak membutuhkannya, letakkan di daftar pengecualian yang sama dengan stempel waktu di bagian atas skrip.
pengguna682385
sumber
2

Saya diberi akses ke database, tetapi bukan tabel tempat kueri saya disimpan.

Terinspirasi oleh @marc_s answe r, saya melihat HeidiSQL yang merupakan program Windows yang dapat menangani MySQL, SQL Server, dan PostgreSQL.

Saya menemukan bahwa itu juga dapat mencari database untuk string.

Klik Cari, lalu Temukan teks di Server

Alat pencarian terbuka.  Pastikan DB dipilih

Ini akan mencari setiap tabel dan memberi Anda berapa kali menemukan string per tabel!

Ari
sumber
1

Isi dari semua prosedur yang tersimpan, tampilan dan fungsi disimpan dalam teks bidang tabel sysComments . Nama semua objek disimpan dalam tabel sysObjects dan kolomnya ada di sysColumns .

Memiliki informasi ini, Anda dapat menggunakan kode ini untuk mencari di konten tampilan, prosedur tersimpan, dan fungsi untuk kata yang ditentukan:

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

Kueri ini akan memberi Anda objek yang berisi kata "tblEmployes".

Untuk mencari berdasarkan nama Objek Anda dapat menggunakan kode ini:

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

Dan terakhir untuk menemukan objek yang memiliki setidaknya satu kolom yang berisi kata "tblEmployes", Anda dapat menggunakan kode ini:

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

Anda dapat menggabungkan tiga kueri ini dengan gabungan:

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

Dengan kueri ini Anda memiliki semua objek yang berisi kata "tblEmployes" dalam konten atau nama atau sebagai kolom.

Mehdi akbari
sumber
0

Berikut ini skrip yang sama seperti yang dikirimkan oleh pengguna l --''''''--------- '' '' '' '' '' '' , tetapi dikoreksi untuk bekerja pada SQL case-sensitive misalnya, dan dengan beberapa perbaikan kecil lainnya.

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
Mike
sumber
0

Berikut adalah cara mencari database di Swift menggunakan perpustakaan FMDB.

Pertama, buka tautan ini dan tambahkan ini ke proyek Anda: FMDB . Ketika Anda telah melakukan itu, maka inilah cara Anda melakukannya. Misalnya, Anda memiliki tabel bernama Person, dan Anda memiliki firstName dan secondName dan Anda ingin mencari data dengan nama depan, berikut adalah kode untuk itu:

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

Kemudian di ViewController Anda, Anda akan menulis ini untuk menemukan detail orang yang Anda cari:

  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
                }
            }
        }
    }
}
hardiBSalih
sumber
Jawaban ini (tentang SQLite) tidak menjawab pertanyaan tersebut. Pertanyaannya adalah tentang SQL Server (produk Microsoft - meskipun mereka juga disalahkan karena memilih nama yang umum untuk suatu produk). Dari halaman GitHub: " FMDB v2.7 ... Ini adalah pembungkus Objective-C di sekitar SQLite "
Peter Mortensen
0

Jika saya ingin menemukan di mana saya ingin mencari, saya menggunakan ini:

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;
Marjol Mehalla
sumber