मैं एक स्ट्रिंग के लिए SQL सर्वर डेटाबेस कैसे खोजूं?


121

मुझे पता है कि यह संभव है, लेकिन मुझे नहीं पता कि कैसे।

मुझे किसी विशिष्ट स्ट्रिंग के सभी उल्लेखों के लिए SQL सर्वर डेटाबेस खोजने की आवश्यकता है।

उदाहरण के लिए: मैं स्ट्रिंग "tblEmployes" (तालिकाओं के भीतर डेटा नहीं) के लिए सभी तालिकाओं, विचारों, कार्यों, संग्रहीत प्रक्रियाओं को खोजना चाहूंगा।

जिन कारणों से मुझे इसकी आवश्यकता है, उनमें से एक यह है कि जो कुछ अतिरिक्त डेटा टेबल बनाए जाते हैं, उन्हें निकालना चाहते हैं, लेकिन मुझे डर है कि वे शायद प्रक्रियाओं या कार्यों में कहीं उपयोग किए जाते हैं।



1
आशा है कि यह किसी की मदद करेगा, stackoverflow.com/questions/13174627/…
NoNaMe

जवाबों:


155

यह एक विशिष्ट डेटाबेस में हर तालिका के हर कॉलम को खोजेगा। उस डेटाबेस पर संग्रहीत कार्यविधि बनाएँ जिसे आप खोजना चाहते हैं।

दस सबसे पूछे जाने वाले SQL सर्वर प्रश्न और उनके उत्तर :

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

यह आश्चर्यजनक रूप से अच्छी तरह से काम करता है !!!


दूसरा परम "सटीक = 0" का क्या अर्थ है?
जंचेन लियू

यदि आप स्क्रिप्ट को देखते हैं तो यह सिर्फ एक परम है जिसे इस मामले में स्टेटमेंट में जल्दी से चेक किया जाता है ताकि यह तय किया जा सके कि 'वैल्यू' या '% वैल्यू%' का उपयोग करके स्ट्रिंग सर्च किया जाए
Chizzle

5
यह केवल पहला परिणाम देता है जो इसे पाता है और कुछ नहीं। क्या डेटाबेस में स्ट्रिंग के सभी उदाहरणों को वापस करने का कोई तरीका है?
किरोबरट्स

1
मुझे इस स्क्रिप्ट को कहाँ सहेजना है और फ़ाइल को निष्पादित करने के लिए किस एक्सटेंशन की आवश्यकता है? मैं कहां से अमल exec FindMyData_string 'google', 0करूं?
ब्लैक

कुछ डेटाबेस संवेदनशील नहीं हैं, कृपया अपने कोड पर INFORMATION_SCHEMA.COLUMNS का उपयोग करें। अन्यथा यह स्क्रिप्ट 'अमान्य ऑब्जेक्ट नाम Information_Schema' त्रुटि को फेंक देगी।
फतह

59

अगर आपको डेटाबेस ऑब्जेक्ट्स (उदाहरण के लिए टेबल, कॉलम और ट्रिगर्स) को नाम से खोजने की आवश्यकता है - SQL Red नामक मुक्त Redgate सॉफ़्टवेयर टूल पर एक नज़र डालें जो ऐसा करता है - यह आपके संपूर्ण डेटाबेस को किसी भी प्रकार के स्ट्रिंग (s) के लिए खोजता है।

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यह किसी भी डीबीए या डेटाबेस डेवलपर के लिए एक महान उपकरण होना चाहिए - क्या मैंने पहले ही उल्लेख किया है कि यह किसी भी तरह के उपयोग के लिए बिल्कुल मुफ्त है ??


25
अच्छा उपकरण है, लेकिन यह तालिकाओं में तार की खोज नहीं करता है
JGilmartin

2
वास्तविक पंक्तियों खोज नहीं करता है
LearningJrDev

8
@LearningJrDev: नहीं - यह डेटाबेस ऑब्जेक्ट्स - तालिकाओं, विचारों, संग्रहीत प्रक्रियाओं आदि को खोजता है - नाम से। यह तालिकाओं में निहित डेटा में खोज नहीं करता है - मैंने कभी दावा नहीं किया कि यह किया है!
marc_s

4
@JGilmartin मुझे उस प्रश्न का हिस्सा उद्धृत करना चाहिए जिसे मैं सभी तालिकाओं, विचारों, कार्यों, संग्रहीत प्रक्रियाओं, ... स्ट्रिंग "tblEmployes" के लिए खोज करना चाहता हूं। (तालिकाओं के भीतर डेटा नहीं) यदि आप तालिका के भीतर डेटा खोजना चाहते हैं तो आपके पास टी-एसक्यूएल भाषा है। यह उपकरण रीफैक्टरिंग कार्यों के लिए बहुत अच्छा है।
नीमके

49

आप ApexSQL 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 खोज बहुत बढ़िया है। इस टूल की स्क्रिप्ट की कोई आवश्यकता नहीं है।
मिगेल

1
यह एक भयानक मदद दोस्त है। इसे
सराहें

3
यह क्वेरी केवल ऑब्जेक्ट के लिए खोज करती है। हमें सभी मौजूदा तालिकाओं में एक स्ट्रिंग खोजने की जरूरत है।
सेसर लियोन

ApexSQL हालांकि आपको अपने प्रकारों को चुनने का एक बड़ा काम करता है
पीटरएफनेट

मैं procs और विचारों के भीतर एक स्ट्रिंग खोजने की कोशिश कर रहा हूँ। एसक्यूएल मेरे लिए एकदम सही है। धन्यवाद।
MsTapp

20

आप अपने डेटाबेस (यदि छोटा है) को अपनी हार्ड ड्राइव / डेस्कटॉप पर निर्यात कर सकते हैं, और फिर बस एक टेक्स्ट सर्च प्रोग्राम या टेक्स्ट एडिटर के माध्यम से एक स्ट्रिंग खोज कर सकते हैं।


7
यह वास्तव में एक बुरा विचार नहीं है।
ओलिवर टापिन

:) आप एक स्क्रिप्ट का भी उपयोग कर सकते हैं। लेकिन एक अच्छा टेक्स्ट एडिटर आपको SQL कोड के लिए लगभग कुछ भी कर सकता है।
इवान इवकोविक

1
और किस पाठ संपादक को कई जीबी डेटा लोड करने में खुशी होगी?
बोहदन

शायद कोई नहीं, लेकिन उस स्थिति में आप किसी तीसरे पक्ष के फ़ाइल खोज इंजन का उपयोग कर सकते हैं, और ऐसे अनुप्रयोग हैं जो फ़ाइल को आपके द्वारा पसंद किए गए टुकड़ों में विभाजित कर सकते हैं।
इवान इवकोविक्व

1
MS SQL निर्यात बाइनरी फाइलें हैं और इसलिए आपके द्वारा प्रस्तावित विधि का उपयोग करके निर्यात, पढ़ा या खोजा नहीं जा सकता है।
स्पेंसर हिल

17

SQL सर्वर में नाम से एक तालिका प्राप्त करने के लिए:

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
यह क्वेरी केवल ऑब्जेक्ट के लिए खोज करती है। हमें सभी मौजूदा तालिकाओं में एक स्ट्रिंग खोजने की जरूरत है।
सेसर लियोन

6

यह कोड खोज प्रक्रिया और कार्य करता है लेकिन तालिका में खोज नहीं करता है :)

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

4

आप ऐसा कर सकते हैं;

  1. एक एकल फ़ाइल के लिए डेटाबेस स्क्रिप्ट और एक पाठ संपादक का उपयोग कर tblEmployees के लिए फ़ाइल खोजें। में SQL सर्वर प्रबंधन स्टूडियो (SSMS), सही डेटाबेस से अधिक क्लिक करें और स्क्रिप्ट उत्पन्न
  2. SSMS 'दृश्य निर्भरता' का उपयोग करें tblEmployees पर राइट-क्लिक करके देखें कि कौन-सी अन्य वस्तुएँ इस पर निर्भर हैं
  3. एक नि: शुल्क तृतीय-पक्ष उपकरण का उपयोग करें जैसे कि Redgate सॉफ़्टवेयर की SQL खोज, सभी डेटाबेस ऑब्जेक्ट को नाम और सामग्री द्वारा कीवर्ड द्वारा खोजने के लिए।

# 1 अच्छा लगता है। मैं सिर्फ सर्वर पर इसे नहीं चला सकता क्योंकि मेरे पास एक्सेस अधिकार नहीं हैं।
bobetko

धन्यवाद। यकीन नहीं होता कि किसी ने आपको -1 क्यों दिया। मैंने तय किया कि RedGate की कोशिश की ... जो पूरी तरह से मैं चाहता हूँ।
बोबेट्को

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;

इसके बारे में कुछ उल्लेख:

  • यह लूप करते समय अवरुद्ध के बजाय कर्सर का उपयोग करता है
  • यह प्रगति को प्रिंट कर सकता है (यदि आवश्यक हो तो)
  • यह कुछ प्रयासों के बाद बाहर निकल सकता है (अंत में IF को अनफिल्ट करें)
  • यह सभी रिकॉर्ड प्रदर्शित करता है
  • आप इसे आवश्यकतानुसार धुन सकते हैं

अस्वीकरण:

  • इसे उत्पादन वातावरण में न चलाएं!
  • यह धीमा है । यदि DB को अन्य सेवाओं / उपयोगकर्ताओं द्वारा एक्सेस किया जाता है, तो कृपया सभी चयनों में, विशेष रूप से डायनामिक चयन वाले सभी तालिका नाम के बाद "(NOLOCK)" के साथ जोड़ें।
  • यह SQL इंजेक्शन विकल्पों के सभी प्रकारों के खिलाफ मान्य / सुरक्षा नहीं करता है।
  • यदि आपका DB विशाल है, तो अपने आप को कुछ नींद के लिए तैयार करें, सुनिश्चित करें कि कुछ मिनटों के बाद क्वेरी को नहीं मारा जाएगा।
  • यह स्ट्रिंग के कुछ मूल्यों को सम्मिलित करता है, जिसमें ints / bigints / smallints / smallints शामिल हैं। यदि आपको उन की आवश्यकता नहीं है, तो उन्हें स्क्रिप्ट के शीर्ष पर टाइमस्टैम्प के साथ एक ही बहिष्करण सूची में डालें।

2

मुझे एक डेटाबेस तक पहुंच दी गई थी, लेकिन उस तालिका को नहीं, जहां मेरी क्वेरी को संग्रहीत किया जा रहा था।

@Marc_s answe r से प्रेरित होकर , मैंने HeidiSQL पर एक नज़र डाली जो कि एक Windows प्रोग्राम है जो MySQL, SQL सर्वर और PostgreSQL से निपट सकता है।

मैंने पाया कि यह एक स्ट्रिंग के लिए डेटाबेस भी खोज सकता है।

खोज पर क्लिक करें, फिर सर्वर पर पाठ खोजें

खोज उपकरण खुला।  सुनिश्चित करें कि 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%'

आप इन तीन प्रश्नों को संघ के साथ जोड़ सकते हैं:

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

एसक्यूएमएस सर्वर मैनेजमेंट स्टूडियो (एसएसएमएस) के साथ एसक्यूएमएस सर्वर ऑब्जेक्ट्स की खोज निम्नलिखित तरीकों से संभव है, एसएसएमएस ऑब्जेक्ट सर्च के साथ: ऑब्जेक्ट एक्सप्लोरर विवरण या टी-एसक्यूएल स्क्रिप्ट निम्नलिखित में बताए गए हैं:


0

यहां बताया गया है कि आप FMDB लाइब्रेरी का उपयोग करके स्विफ्ट में डेटाबेस कैसे खोज सकते हैं।

सबसे पहले, इस लिंक पर जाएं और इसे अपनी परियोजना में जोड़ें: FMDB । जब आपने ऐसा कर लिया है, तो यहाँ है कि आप इसे कैसे करते हैं। उदाहरण के लिए, आपके पास व्यक्ति नामक एक तालिका है, और आपके पास पहला नाम और दूसरा नाम है और आप पहले नाम से डेटा ढूंढना चाहते हैं, यहां इसके लिए एक कोड है:

    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 सर्वर (Microsoft के उत्पाद के बारे में था - हालांकि दोष उन पर भी है कि वे किसी उत्पाद के लिए ऐसा सामान्य नाम चुनें)। GitHub पृष्ठ से: " FMDB v2.7 ... यह SQLite के आसपास एक उद्देश्य-सी आवरण है "
पीटर मोर्टेंसन

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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.