sql - पूरे डेटाबेस के अंदर एक स्ट्रिंग कैसे खोजें?



database sql-server-2008 (7)

मेरे पास एक विशिष्ट स्ट्रिंग है, जैसे उदाहरण के लिए "123abcd" लेकिन मुझे तालिका का नाम या मेरे SQL सर्वर डेटाबेस पर तालिका के अंदर कॉलम का नाम भी नहीं पता है। मैं इसे एक चयन के साथ ढूंढना चाहता हूं और संबंधित स्ट्रिंग के सभी कॉलम दिखाऊंगा, इसलिए मैं कुछ ऐसा सोच रहा था:

select * from Database.dbo.* where * like  '%123abcd%'

स्पष्ट कारणों से यह काम नहीं करता है, लेकिन ऐसा कुछ करने के लिए एक चुनिंदा कथन बनाने का एक आसान तरीका है?

https://src-bin.com


Answer #1

ऑरैकल में आप आवश्यक एसक्यूएल कमांड जेनरेट करने के लिए निम्न एसक्यूएल कमांड का उपयोग कर सकते हैं:

select 
     "select * "
     " from "||table_name||
     " where "||column_name||" like '%123abcd%' ;" as sql_command
from user_tab_columns
where data_type='VARCHAR2';

Answer #2

देर से उत्तर के लिए खेद है, लेकिन मेरे पास अभी भी यह सवाल था और यह किसी अन्य दृष्टिकोण का उपयोग करके इसे हल करने के लिए समाप्त हो गया जो शायद सभी डेटाबेस के लिए अधिक सामान्य है।

  1. डेटाबेस डंप बनाएं।
  2. वहां से आप फ़ाइल को एक टेक्स्ट एडिटर में खोलने और आवश्यक स्ट्रिंग की खोज करने में सक्षम होना चाहिए।

Answer #3

मैं आमतौर पर sys.tables और sys.tables उपयोग information_Schema.columns हूं, हालांकि @yuck ने कहा, sys.tables और sys.tables टाइप करने के लिए कम हैं।

एक लूप में, इन्हें संयोजित करें

@sql = @sql + 'select' + column_name + 
' from ' + table_name + 
' where ' + column_name ' like ''%''+value+''%' UNION

फिर परिणामस्वरूप एसक्यूएल निष्पादित करें।


Answer #4

यह काम करेगा:

DECLARE @MyValue NVarChar(4000) = 'something';

SELECT S.name SchemaName, T.name TableName
INTO #T
FROM sys.schemas S INNER JOIN
     sys.tables T ON S.schema_id = T.schema_id;

WHILE (EXISTS (SELECT * FROM #T)) BEGIN
  DECLARE @SQL NVarChar(4000) = 'SELECT * FROM $$TableName WHERE (0 = 1) ';
  DECLARE @TableName NVarChar(1000) = (
    SELECT TOP 1 SchemaName + '.' + TableName FROM #T
  );
  SELECT @SQL = REPLACE(@SQL, '$$TableName', @TableName);

  DECLARE @Cols NVarChar(4000) = '';

  SELECT
    @Cols = COALESCE(@Cols + 'OR CONVERT(NVarChar(4000), ', '') + C.name + ') = CONVERT(NVarChar(4000), ''$$MyValue'') '
  FROM sys.columns C
  WHERE C.object_id = OBJECT_ID(@TableName);

  SELECT @Cols = REPLACE(@Cols, '$$MyValue', @MyValue);
  SELECT @SQL = @SQL + @Cols;

  EXECUTE(@SQL);

  DELETE FROM #T
  WHERE SchemaName + '.' + TableName = @TableName;
END;

DROP TABLE #T;

हालांकि, कुछ चेतावनी। सबसे पहले, यह अपमानजनक रूप से धीमी और गैर-अनुकूलित है । सभी मानों को आसानी से nvarchar परिवर्तित किया जा रहा है ताकि उन्हें त्रुटि के बिना तुलना की जा सके। आप उन मूल्यों के साथ समस्याओं में भाग ले सकते हैं जैसे datetime अपेक्षित रूप से परिवर्तित नहीं हो रहा है और इसलिए जब वे होना चाहिए (झूठी नकारात्मक) होना चाहिए।

WHERE (0 = 1) इमारत बनाने OR क्लॉज को आसान बनाने के लिए है। यदि कोई मिलान नहीं है तो आपको कोई पंक्ति वापस नहीं मिलेगी।


Answer #5

यहां कुछ और निःशुल्क टूल हैं जिनका उपयोग इस के लिए किया जा सकता है। दोनों एसएसएमएस एडिन के रूप में काम करते हैं।

ApexSQL खोज - 100% मुफ़्त - टेबल में स्कीमा और डेटा दोनों की खोज करता है। दो अतिरिक्त उपयोगी विकल्प हैं जैसे कि निर्भरता ट्रैकिंग ...

एसएसएमएस टूल्स पैक - एसक्यूएल 2012 को छोड़कर सभी संस्करणों के लिए मुफ्त - पिछले के रूप में उन्नत नहीं दिखता है लेकिन इसमें कई अन्य शानदार सुविधाएं हैं।


Answer #6

सामान्य संसाधन Grep (crgrep) नाम या सामग्री द्वारा टेबल / कॉलम में स्ट्रिंग मैचों की खोज करेगा और SQLServer, Oracle और अन्य सहित कई डीबी का समर्थन करेगा। पूर्ण जंगली-कार्डिंग और अन्य उपयोगी विकल्प।

यह ओपनसोर्स है (मैं लेखक हूं)।

http://sourceforge.net/projects/crgrep/


Answer #7
create procedure usp_find_string(@string as varchar(1000))
as
begin
declare @mincounter as int
declare @maxcounter as int
declare @stmtquery as varchar(1000)
set @stmtquery=''
create table #tmp(tablename varchar(128),columnname varchar(128),rowid int identity)
create table #tablelist(tablename varchar(128),columnname varchar(128))
declare @tmp table(name varchar(128))
declare @tablename as varchar(128)
declare @columnname as varchar(128)

insert into #tmp(tablename,columnname)
select a.name,b.name as columnname from sysobjects a
inner join syscolumns b on a.name=object_name(b.id)
where a.type='u'
and b.xtype in(select xtype from systypes
    where name='text' or name='ntext' or name='varchar' or name='nvarchar' or name='char' or name='nchar')
order by a.name

select @maxcounter=max(rowid),@mincounter=min(rowid) from #tmp 
while(@mincounter <= @maxcounter )
begin
 select @tablename=tablename, @columnname=columnname from #tmp where [email protected]
 set @stmtquery ='select top 1  ' + '[' [email protected]+']' + ' from ' + '['[email protected]+']' + ' where ' + '['[email protected]+']' + ' like ' + '''%' + @string + '%'''
 insert into @tmp(name) exec(@stmtquery)
 if @@rowcount >0
 insert into #tablelist values(@tablename,@columnname)
 set @[email protected] +1
end
select * from #tablelist
end




select