Bir SQL Server veritabanında bir dizeyi nasıl arayabilirim?


121

Bunun mümkün olduğunu biliyorum ama nasıl yapacağımı bilmiyorum.

Belirli bir dizenin tüm bahsedenleri için bir SQL Server veritabanını aramam gerekiyor.

Örneğin: Tüm tabloları, görünümleri, işlevleri, saklı yordamları, ... "tblEmployes" dizesini (tablolardaki verileri değil) aramak istiyorum.

Buna ihtiyacım olan nedenlerden biri, oluşturulan bazı ekstra veri tablolarını kaldırmak istiyorum, ancak korkarım prosedürler veya işlevlerde bir yerde kullanılıyor olabilirler.



1
Umarım bu birine yardımcı olur, stackoverflow.com/questions/13174627/…
NoNaMe

Yanıtlar:


155

Bu, belirli bir veritabanındaki her tablonun her sütununu arayacaktır. Veritabanında arama yapmak istediğiniz saklı yordamı oluşturun.

En Çok Sorulan On SQL Server Sorusu ve Cevapları :

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

Çalıştırmak için şunu yapın:

exec FindMyData_string 'google', 0

İnanılmaz derecede iyi çalışıyor !!!


2. parametre "exactMatch = 0" ne anlama geliyor?
Junchen Liu

Betiğe bakarsanız, daha önce bir case ifadesinde kontrol edilen ve 'değer' veya '% değer%' kullanarak dize araması yapıp
yapmamaya

5
Bu yalnızca bulduğu ilk sonucu döndürür ve başka hiçbir şey döndürmez. Veritabanındaki dizenin tüm örneklerini döndürmesinin bir yolu var mı?
qroberts

1
Bu komut dosyasını nereye kaydetmeliyim ve dosyanın çalıştırılması gereken uzantı nedir? Nerede icra ederim exec FindMyData_string 'google', 0?
Kara

Bazı veritabanları büyük / küçük harfe duyarlı değildir, lütfen kodunuzda INFORMATION_SCHEMA.COLUMNS kullanın. Aksi takdirde bu komut dosyası 'geçersiz nesne adı Information_Schema' hatası verir.
Fatih

59

Veritabanı nesnelerini (örneğin tablolar, sütunlar ve tetikleyiciler) isme göre bulmanız gerekiyorsa - bunu yapan SQL Search adlı ücretsiz Redgate Yazılım aracına bir göz atın - tüm veritabanınızda her türlü dizge (ler) için arama yapar.

Buraya resim açıklamasını girin

Buraya resim açıklamasını girin

Bu, herhangi bir DBA veya veritabanı geliştiricisi için sahip olunması gereken harika bir araçtır - herhangi bir kullanım için kullanılmasının tamamen ücretsiz olduğundan bahsetmiş miydim ?


25
İyi bir araç, ancak tablolardaki dizeleri
aramıyor

2
Gerçek satırları aramıyor
LearningJrDev

8
@LearningJrDev: hayır - veritabanı nesnelerini - tablolar, görünümler, saklanan prosedürler vb. - isme göre arar . Bu mu DEĞİL tablolarda yer alan verilerde arama - Öyle olduğunu iddia etmedik!
marc_s

4
@JGilmartin "tblEmployes" dizesi için tüm tabloları, görünümleri, işlevleri, saklı yordamları, ... aramak istediğim sorunun bir kısmından alıntı yapmama izin verin . (Tabloların içindeki veriler değil) Tablo içinde veri aramak istiyorsanız T-SQL diline sahipsiniz. Bu araç, yeniden düzenleme görevleri için harika.
nemke

49

ApexSQL Aramasını da deneyebilirsiniz - bu , SQL Search'e benzer ücretsiz bir SSMS eklentisidir .

Gerçekten sadece SQL kullanmak istiyorsanız, bu komut dosyasını denemek isteyebilirsiniz:

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 Arama harika. Bu araçla komut dosyalarına gerek yok.
Miguel

1
Bu harika bir yardım arkadaşı. Takdir et: D
miniGweek

3
Bu sorgu yalnızca nesneleri arar. Mevcut tüm tablolarda bir dizge aramamız gerekir.
César León

ApexSQL, türlerinizi seçmenize izin verme konusunda harika bir iş çıkarıyor
PeterFnet

İşlemler ve görünümler içinde bir dizge bulmaya çalışıyorum. SQL benim için mükemmel. Teşekkür ederim.
MsTapp

20

Veritabanınızı (küçükse) sabit sürücünüze / masaüstünüze aktarabilir ve ardından bir metin arama programı veya metin düzenleyicisi aracılığıyla bir dizi araması yapabilirsiniz.


7
Aslında bu kötü bir fikir değil.
Oliver Tappin

:) Sen de bir komut dosyası kullanabilirsin. Ancak iyi bir metin düzenleyici, bir SQL kodu için ihtiyacınız olan hemen hemen her şeyi yapabilir.
Ivan Ivković

1
Hangi metin düzenleyicisi çok sayıda GB veriyi yüklemekten memnun olur?
Bohdan

Muhtemelen hiçbiri, ancak bu durumda üçüncü taraf bir dosya arama motoru kullanabilirsiniz ve dosyayı istediğiniz kadar parçaya bölebilen uygulamalar vardır.
Ivan Ivković

1
MS SQL dışa aktarımları ikili dosyalardır ve bu nedenle önerdiğiniz yöntem kullanılarak dışa aktarılamaz, okunamaz veya aranamaz.
Spencer Hill

17

SQL Server'da isme göre tablo almak için:

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

Saklanan bir yordamı ada göre bulmak için:

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

Bir tabloyla ilgili tüm saklı yordamları almak için:

----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
Bu sorgular yalnızca nesneleri arar. Mevcut tüm tablolarda bir dizge aramamız gerekir.
César León

6

Bu kod arama prosedürü ve işlevi ancak tabloda arama değil :)

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

4

Yapabilirdiniz;

  1. Veritabanını tek bir dosyaya kodlayın ve bir metin düzenleyicisi kullanarak tblEmployees için dosyayı arayın. Gelen SQL Server Management Studio (SSMS) sağ veritabanını üzerinde tıklayın ve kodları oluştur .
  2. Hangi diğer nesnelerin ona bağımlı olduğunu görmek için tblEmployees üzerine sağ tıklayarak SSMS 'Bağımlılıkları Görüntüle'yi kullanın
  3. Tüm veritabanı nesnelerini ada ve içeriğe göre anahtar kelimeye göre aramak için Redgate Software'in SQL Araması gibi ücretsiz bir üçüncü taraf aracı kullanın .

# 1 kulağa hoş geliyor. Erişim haklarına sahip olmadığım için sunucuda çalıştıramıyorum.
bobetko

Teşekkürler. Birinin size neden -1 verdiğinden emin değilim. Bunu düzelttim. RedGate'i denedim ... bu tamamen istediğimi yapıyor.
bobetko

2

Bu, her veritabanı üzerinde bir dize arayacaktır:

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

Benim versiyonum...

Açık nedenlerden ötürü ona "samanlıkta iğne" adını verdim.

Sütun adları vb. İçin değil, her satırda ve her sütunda belirli bir değer arar.

Aramayı yürütün (tabii ki ilk iki değişken için değerleri değiştirin):

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;

Ardından, başka bir pencereden çalıştırılırken bile sonuçları görüntülemek için şunu çalıştırı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;

Bundan çok az bahsediliyor:

  • blocking while döngüsü yerine imleçler kullanır
  • ilerlemeyi yazdırabilir (gerekirse yorum yazabilir)
  • birkaç denemeden sonra çıkabilir (sonunda IF'nin açıklamasını kaldırın)
  • tüm kayıtları görüntüler
  • gerektiği gibi ince ayar yapabilirsiniz

FERAGATNAMELER:

  • Üretim ortamlarında ÇALIŞTIRMAYIN!
  • Öyle yavaş . DB'ye diğer hizmetler / kullanıcılar tarafından erişiliyorsa, lütfen tüm seçimlerdeki her tablo adından sonra, özellikle dinamik seçimlerden sonra "WITH (NOLOCK)" ekleyin.
  • Her türlü SQL enjeksiyon seçeneğini doğrulamaz / bunlara karşı koruma sağlamaz.
  • DB'niz çok büyükse, kendinizi biraz uykuya hazırlayın, sorgunun birkaç dakika sonra ölmeyeceğinden emin olun.
  • İnts / bigints / smallints / tinyints dahil olmak üzere bazı değerleri dizgeye çevirir. Bunlara ihtiyacınız yoksa, zaman damgaları komut dosyasının en üstünde olacak şekilde onları aynı dışlama listelerine koyun.

2

Bir veritabanına erişim sağlandı, ancak sorgumun depolandığı tabloya erişim verilmedi.

@Marc_s yanıtından esinlenerek HeidiSQL'e bir göz attım , MySQL, SQL Server ve PostgreSQL ile başa çıkabilen bir Windows programı olan .

Bir dize için bir veritabanında da arama yapabildiğini buldum.

Ara'yı ve ardından Sunucuda Metin Bul'u tıklayın.

Arama aracı açık.  DB'nin seçildiğinden emin olun

Her tabloyu arayacak ve size tablo başına dizeyi kaç kez bulduğunu verecektir!


1

Saklanan tüm prosedürlerin, görünümlerin ve işlevlerin içeriği tablo sysComments'ın alan metninde saklanır . Tüm nesnelerin adı sysObjects tablosunda ve sütunlar sysColumns'da saklanır .

Bu bilgilere sahip olarak, bu kodu, belirtilen kelime için görünümlerin, saklanan prosedürlerin ve işlevlerin içeriğinde arama yapmak için kullanabilirsiniz:

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

Bu sorgu size "tblEmployes" sözcüğünü içeren nesneleri verecektir.

Nesnelerin adına göre arama yapmak için bu kodu kullanabilirsiniz:

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

Ve son olarak "tblEmployes" kelimesini içeren en az bir sütuna sahip nesneleri bulmak için şu kodu kullanabilirsiniz:

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

Bu üç sorguyu union ile birleştirebilirsiniz:

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

Bu sorgu ile içerik veya ad veya sütun olarak "tblEmployes" kelimesini içeren tüm nesnelere sahip olursunuz.


0

Burada l - "" ""--------- '' '' '' '' '' 'kullanıcısı tarafından gönderilen komut dosyası ile aynıdır , ancak büyük / küçük harfe duyarlı bir SQL üzerinde çalışmak üzere düzeltilmiştir örnek ve diğer bazı küçük iyileştirmelerle.

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

İşte, FMDB kütüphanesini kullanarak Swift'deki veritabanında nasıl arama yapabileceğiniz.

Öncelikle bu bağlantıya gidin ve bunu projenize ekleyin: FMDB . Bunu yaptığınızda, işte nasıl yapacağınız. Örneğin, Kişi adında bir tablonuz var ve adınız ve ikinci adınız var ve verileri ada göre bulmak istiyorsanız, işte bunun için bir kod:

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

Ardından, ViewController'ınızda aradığınız kişi ayrıntılarını bulmak için bunu yazacaksınız:

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

Bu cevap (SQLite hakkında) soruyu cevaplamaz. Soru SQL Server ile ilgiliydi (Microsoft'un ürünü - yine de bir ürün için böyle genel bir ad seçtikleri için suç onlar üzerinedir). GitHub sayfasından: " FMDB v2.7 ... Bu, SQLite için bir Objective-C sarmalayıcısıdır "
Peter Mortensen

0

Aramak istediğim herhangi bir şeyin nerede olduğunu bulmak istersem, şunu kullanırım:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.