2012-02-07 16 views
75

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

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

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

किसी भी मदद की सराहना की जाती है।

+3

[एसक्यूएल सर्च रेडगेट] (http://www.red-gate.com/products/sql-development/sql-search/) –

+0

आशा है कि इससे किसी की मदद मिलेगी, http://stackoverflow.com/questions/13174627/खोज-पाठ-से-डीबी-एसक्यूएल-सर्वर/22854200 # 22854200 – NoNaMe

उत्तर

15

एसक्यूएल सर्वर में नाम से एक मेज हो रही के लिए: नाम से एक संग्रहीत प्रक्रिया को खोजने के लिए

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

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

97

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

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#2:।

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

दूसरा पैरा "सटीक मैच = 0" का अर्थ क्या है? –

+0

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

+2

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

3

आप कर सकते थे;

  1. स्क्रिप्ट एक एकल फाइल करने के लिए डेटाबेस और एक पाठ संपादक का उपयोग कर tblEmployees के लिए फ़ाइल खोज करते हैं। SQL सर्वर प्रबंधन उपकरण (SSMS) में डेटाबेस पर राइट क्लिक करें और स्क्रिप्ट जेनरेट करें चुनें।
  2. उपयोग SSMS 'देखें dependancies' राइट क्लिक करके tblEmployees से अधिक जो अन्य वस्तुओं उस पर निर्भर कर रहे हैं देखने के लिए
  3. ऐसे Redgate SQLSearch के रूप में एक नि: शुल्क 3 पार्टी उपकरण कीवर्ड द्वारा नाम और सामग्री द्वारा सभी डेटाबेस ऑब्जेक्ट्स खोज करने के लिए प्रयोग करें।
+0

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

+0

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

53

आप (जैसे टेबल, कॉलम, चलाता है) नाम से डाटाबेस वस्तुओं को खोजने के लिए की जरूरत है - मुफ्त लाल गेट जो ऐसा करता है SQL Search बुलाया उपकरण पर एक नजर है - यह किसी भी प्रकार के अपने पूरे डेटाबेस खोज स्ट्रिंग (एस) के।

enter image description here

enter image description here

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

+19

अच्छा उपकरण, लेकिन यह तालिका में स्ट्रिंग्स की खोज नहीं करता – JGilmartin

+0

मेरे लिए काम नहीं करता है। मैं एसक्यूएल एज़ूर का उपयोग कर रहा हूं। –

+2

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

10

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

+5

यह वास्तव में एक बुरा विचार नहीं है। –

+0

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

+0

और कौन सा टेक्स्ट एडिटर कई जीबी डेटा लोड करने में खुश होगा? – Bohdan

41

आप ApexSQL Search भी कोशिश कर सकते हैं - यह SQL खोज के समान एक निःशुल्क SSMS जोड़ है।

तुम सच में ही उपयोग करने के लिए आप इस स्क्रिप्ट

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 खोज भयानक है। इस उपकरण के साथ स्क्रिप्ट के लिए कोई ज़रूरत नहीं है। – Mike

+1

यह एक शानदार मदद साथी है। इसकी सराहना करें: डी – miniGweek

+1

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

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 ''%'[email protected]_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] 
-3

मान लें कि आप एक काम नहीं चलेगा पूरे डेटाबेस में सार्वजनिक खोज और आप केवल एक कीवर्ड खोजना चाहते हैं, यह सबसे सरल, क्लीनर और तेज़ समाधान है।

  1. अपने डेटाबेस को फ़ाइल में डंप करें।

    $ mysqldump -u root -p your_database > your_database.sql 
    
  2. उस फ़ाइल

    $ grep 'keyword' your_database.sql 
    

पर एक ग्रेप है और आप काम हो गया।

+3

"माइक्रोसॉफ्ट एसक्यूएल सर्वर" नहीं चुनने का एक अच्छा काम करता है, माईएसQL – HEDMON

+0

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

5

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

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

पुराना सवाल है, मुझे पता है, लेकिन यहाँ मेरी संस्करण ... चला जाता है मैं यह स्पष्ट करने के लिए "भूसे के ढेर में सुई" नाम कारणों।

यह स्तंभ नाम आदि

खोज निष्पादित (बेशक पहले दो वैरिएबल के मान की जगह) के लिए नहीं, प्रत्येक पंक्ति और प्रत्येक स्तंभ में विशिष्ट मूल्य के लिए खोज करता:

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 [email protected]_DB AND DATA_TYPE NOT IN ('timestamp', 'datetime'); 

DECLARE @TOTAL int = (SELECT COUNT(*) 
FROM information_schema.columns WHERE [email protected]_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+'.'[email protected]_SCHEMA+'.'[email protected]_NAME+': '[email protected]_NAME+' ('[email protected]_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 '''[email protected]_CATALOG+''' catalog_name, '''[email protected]_SCHEMA+''' schema_name, '''[email protected]_NAME+''' table_name, '''[email protected]_NAME+''' column_name, '''[email protected]_TYPE+''' data_type, ' + 
      +' COUNT(['[email protected]_NAME+']) records '+ 
      +' FROM '[email protected]_CATALOG+'.'[email protected]_SCHEMA+'.'[email protected]_NAME + 
      +' WHERE ' + CASE WHEN @SHOULD_CAST=1 THEN 'CAST(['[email protected]_NAME + '] as NVARCHAR(max)) ' ELSE ' ['[email protected]_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 @[email protected]+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'%@[email protected]%' 
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 '''[email protected]_CATALOG+''' catalog_name, '''[email protected]_SCHEMA+''' schema_name, '''[email protected]_NAME+''' table_name, '''[email protected]_NAME+''' column_name, '''[email protected]_TYPE+''' data_type, ' + 
      +' ['[email protected]_NAME+']'+ 
      +', * ' 
      +' FROM '[email protected]_CATALOG+'.'[email protected]_SCHEMA+'.'[email protected]_NAME + 
      +' WHERE ' + CASE WHEN @SHOULD_CAST=1 THEN 'CAST(['[email protected]_NAME + '] as NVARCHAR(max)) ' ELSE ' ['[email protected]_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 @[email protected]+1 
    -- IF @i > 10 
    -- BREAK 
END 
CLOSE col_cur; 
DEALLOCATE col_cur; 

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

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

अस्वीकरण के रूप में ठीक कर सकते हैं:

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

उम्मीद है कि इससे मदद मिलती है।

0

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

@marc_s जवाब से प्रेरित होकर, मैं HeidiSQL पर एक नज़र जो एक Windows प्रोग्राम है कि MySQL के साथ सौदा कर सकते हैं किया था, एमएसएसक्यूएल और पोस्टग्रेएसक्यूएल।

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

Click Search, then Find text on Server

Search tool open. Make sure the DB is selected

यह हर तालिका खोज और आप स्ट्रिंग पाया में कितनी बार तालिका के अनुसार दे देंगे!

संबंधित मुद्दे