पुराना सवाल है, मुझे पता है, लेकिन यहाँ मेरी संस्करण ... चला जाता है मैं यह स्पष्ट करने के लिए "भूसे के ढेर में सुई" नाम कारणों।
यह स्तंभ नाम आदि
खोज निष्पादित (बेशक पहले दो वैरिएबल के मान की जगह) के लिए नहीं, प्रत्येक पंक्ति और प्रत्येक स्तंभ में विशिष्ट मूल्य के लिए खोज करता:
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 शामिल हैं। यदि आपको उनकी आवश्यकता नहीं है, तो उन्हें स्क्रिप्ट के शीर्ष पर टाइमस्टैम्प के साथ एक ही बहिष्करण सूचियों पर रखें।
उम्मीद है कि इससे मदद मिलती है।
[एसक्यूएल सर्च रेडगेट] (http://www.red-gate.com/products/sql-development/sql-search/) –
आशा है कि इससे किसी की मदद मिलेगी, http://stackoverflow.com/questions/13174627/खोज-पाठ-से-डीबी-एसक्यूएल-सर्वर/22854200 # 22854200 – NoNaMe