2009-05-07 9 views
17

मेरे पास एक डेटाबेस है जहां विभिन्न तालिकाओं में विभिन्न स्थानों में गलत वर्तनी वाली स्ट्रिंग दिखाई देती है। क्या कोई SQL क्वेरी है जिसका उपयोग मैं डेटाबेस में प्रत्येक संभावित वर्कर/टेक्स्ट कॉलम में इस स्ट्रिंग को खोजने के लिए कर सकता हूं?एसक्यूएल: डेटाबेस में प्रत्येक वर्चर कॉलम में एक स्ट्रिंग की खोज करें

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

यदि मैं मदद करता हूं तो मैं एमएस एसक्यूएल सर्वर का उपयोग कर रहा हूं।

उत्तर

22

here मिली तकनीक का उपयोग करके निम्नलिखित स्क्रिप्ट दिए गए डेटाबेस में सभी ((n) var) char कॉलम के लिए SELECT का उत्पन्न करती है। आउटपुट कॉपी/पेस्ट करें, आखिरी 'यूनियन' को हटाएं और निष्पादित करें .. आपको जिस स्ट्रिंग को आप ढूंढ रहे हैं उसके साथ आपको मिस्सेलिंग को प्रतिस्थापित करने की आवश्यकता होगी।

select 
'select distinct ''' + tab.name + '.' + col.name 
+ ''' from [' + tab.name 
+ '] where [' + col.name + '] like ''%MISSPELLING HERE%'' union ' 
from sys.tables tab 
join sys.columns col on (tab.object_id = col.object_id) 
join sys.types types on (col.system_type_id = types.system_type_id) 
where tab.type_desc ='USER_TABLE' 
and types.name IN ('CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR'); 
+0

+1 अच्छा छोटा जवाब, इसे देखने के लिए धन्यवाद। मैं इंतजार करूँगा और देख सकता हूं कि एक –

+2

+1 चुनने से पहले या तो अधिक से अधिक हो जाता है या नहीं, यदि आप इसे उत्पादन डेटाबेस – Andomar

+0

पर चलाने की योजना बनाते हैं तो शायद (NOLOCK) या "सेट लेनदेन अलगाव स्तर को असामान्य पढ़ें" यदि आप NOLOCK को पूरा करना चाहते हैं? मुझे लगता है कि sys.objects अक्सर अद्यतन नहीं किया जाता है। – edosoft

4

आप उनके माध्यम से जाने के लिए एक कर्सर और sys.tables/sys.columns विचारों का उपयोग कर सकते हैं। मुझे एक मिनट दो, और मैं आपको कोड दूंगा।

अद्यतन: यहाँ आप कर रहे हैं:

declare @col_name nvarchar(50) 
declare @sql nvarchar(max) 
declare @tbl_name nvarchar(50) 
declare @old_str nvarchar(50) 
declare @new_str nvarchar(50) 

set @old_str = 'stakoverflow' 
set @new_str = 'StackOverflow' 

declare fetch_name cursor for 
select 
    c.name, 
    t.name 
from 
    sys.columns c 
    inner join sys.tables t on c.object_id = t.object_id 
    inner join sys.types y on c.system_type_id = y.system_type_id 
where 
    y.name like '%varchar' 
    or y.name like '%text' 

open fetch_name 

fetch next from fetch_name into @col_name, @tbl_name 

while @@fetch_status = 0 
begin 
    set @sql = 'UPDATE ' + @tbl_name + ' SET ' + 
     @col_name + ' = replace(' + 
      @col_name + ',''' + 
      @old_str + ''',''' + 
      @new_str + ''')' 

    exec sp_executesql @sql 

    fetch next from fetch_name into @col_name 
end 

close fetch_name 
deallocate fetch_name 

यह आप सब कुछ आप की जरूरत मिल जाएगा। यह स्तंभों को पकड़ता है जो आपके डेटाबेस से वर्चर, nvarchar, पाठ, और ntext हैं, कॉलम के माध्यम से चक्र और प्रत्येक अद्यतन।

बेशक, आप एक समेकित एसक्यूएल स्टेटमेंट बनाने के लिए भी ऐसा कर सकते हैं और अंत में एक बड़ा अपडेट कर सकते हैं, लेकिन हे, यह आपकी वरीयता है।

और रिकॉर्ड के लिए, मुझे कर्सर पसंद नहीं हैं, लेकिन चूंकि हम कुछ कॉलम से निपट रहे हैं और लाखों पंक्तियों से नहीं, मैं इस के साथ ठीक हूं।

+0

अच्छी लिपि। हालांकि मुझे ऐसा लगता है कि यह केवल एक ही तालिका को अपडेट करता है (जिसे 'माईटेबल' कहा जाता है)? – edosoft

+0

काफी सही। इसे गतिशील होने के लिए संपादित किया गया। – Eric

+0

+1 कूल, मैं ऐसा कुछ करने पर काम कर रहा था जो इस तरह दिखता है। दोनों अच्छे जवाब, मैं इंतजार करूंगा और देख सकता हूं कि कोई एक चुनने के लिए दूसरे से अधिक उभरा है या नहीं। –

1

एसक्यूएल सर्वर 2000 के संस्करण स्क्रिप्ट के ऊपर (edosoft से):

select 
'select distinct ''[' + tab.name + ']'' as TableName, ''[' + col.name + ']'' as ColumnName' 
+ ' from [' + users.name + '].[' + tab.name 
+ '] where UPPER([' + col.name + ']) like ''%MISSPELLING HERE%'' union ' 
from sysobjects tab 
join syscolumns col on (tab.id = col.id) 
join systypes types on (col.xtype = types.xtype) 
join sysusers users on (tab.uid = users.uid) 
where tab.xtype ='U' 
and types.name IN ('char', 'nchar', 'varchar', 'nvarchar'); 
-1
select column_name from information_schema.columns 
    where table_name ='magazines' and DATA_TYPE IN ('CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR'); 

आशा है कि यह मदद करता है

7

इस के लिए प्रश्नों का उपयोग करते हुए इस और अधिक जटिल कर देगा वास्तव में जरूरत से। वहां मौजूद कुछ मुफ्त SQL खोज टूल पर विचार क्यों न करें। एपेक्स एसक्यूएल में ApexSQL Search है, और रेड-गेट से SQL Search भी है। इन दोनों को आसानी से काम मिल जाएगा।

0

अगर किसी को सिबबेस के लिए ऐसा कुछ चाहिए तो निम्नलिखित मदद कर सकता है।

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

नहीं प्रदर्शन अनुकूलित किया है, डीबी कॉलम के माध्यम से लूप करने के लिए एक कर्सर का उपयोग, तो यह एक बड़ा डीबी पर इस चलाने के लिए कुछ समय लग सकता (आकार के आधार पर टेबल/कॉलम आदि की संख्या)

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

----------------------------------------------------------------------------------------------------- 
-- SYBASE - SCRIPT TO FIND STRING IN ANY COLUMN IN TABLE AND PRINT TableName/ColumnName TO RESULTS -- 
----------------------------------------------------------------------------------------------------- 

-- tested on Sybase ASE 15.7 

set nocount off 

-- CREATE OBJECTS REQUIRED FOR SCRIPT 
create table #SearchString (SearchString varchar(100)) 
go 

-- SET SEARCH STRING 
declare @search_string varchar(100) 
set @search_string = 'SEARCH_STRING' 

-- WRITE SEARCH STRING TO TEMP TABLE TO STORE IT AWAY AND BE ABLE TO READ IT IN NEXT BATCH 
insert into #SearchString (SearchString) 
    values (@search_string) 

-- GET ALL RELEVANT TABLES AND COLUMNS 
insert #TabCol 
    select object_name(o.id) as TableName, c.name as ColumnName 
     from sysobjects o, syscolumns c 
    where o.type = 'U' -- ONLY USER TABLES 
      and c.usertype in (1,2,18,19,24,25,42) -- ONLY LOOK FOR CHAR, VARCHAR, ETC. 
      and c.id = o.id 
      and c.name is not null 
      and c.length >= datalength(@search_string) 
go 

-- GET TOTAL NUMBER OF RELEVANT COLUMNS 
select count(*) as RelevantColumns from #TabCol 
go 

-- CREATE CURSOR TO LOOP THROUGH TABLES AND COLUMNS TO FIND COLUMNS CONTAINING THE SEARCH STRING 
declare cur cursor for 
select TableName, ColumnName from #TabCol order by TableName, ColumnName 
for read only 
go 

-- VARIABLE DEFINITION 
declare 
    @table_name  SYSNAME, 
    @table_id  int, 
    @column_name SYSNAME, 
    @sql_string  varchar(2000), 
    @search_string varchar(100) 

-- GET SEARCH STRING FROM TABLE 
select @search_string = SearchString from #SearchString 

-- CURSOR INIT 
open cur 

fetch cur into @table_name, @column_name 

-- LOOP THROUGH TABLES AND COLUMNS SEARCHING FOR SEARCH STRING AND PRINT IF FOUND 
while (@@sqlstatus != 2) 
begin 
    set @sql_string = 'if exists (select * from ' + @table_name + ' where [' + @column_name + '] like ''%' + @search_string + '%'') print ''' + @table_name + ', ' + @column_name + '''' 
    execute(@sql_string) 
    fetch cur into @table_name, @column_name 
end 
go 

-- CLEAN-UP 
close cur 
deallocate cur 

drop table #SearchString 
drop table #TabCol 
go 

चीयर्स

0

मैं edosoft के संस्करण के लिए स्कीमा शामिल थे।

select 
'select distinct ''[' + SCHEMA_NAME(tab.schema_id) + '].[' + tab.name + '].[' + col.name + ']' 
+ ''' from [' + SCHEMA_NAME(tab.schema_id) + '].[' + tab.name 
+ '] where [' + col.name + '] like ''%hsapp%'' union ' 
from sys.tables tab 
join sys.columns col on (tab.object_id = col.object_id) 
join sys.types types on (col.system_type_id = types.system_type_id) 
where tab.type_desc ='USER_TABLE' 
and types.name IN ('CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR'); 
संबंधित मुद्दे