यह कोड इसे SQL 2005 में करना चाहिए, लेकिन कुछ चेतावनी:
-
यह हास्यास्पद रूप से धीमा है। मैंने इसे एक छोटे डेटाबेस पर परीक्षण किया जिसमें मेरे पास केवल कुछ मुट्ठी भर टेबल हैं और इसे पूरा करने में कई मिनट लग गए। यदि आपका डेटाबेस इतना बड़ा है कि आप इसे समझ नहीं सकते हैं तो यह शायद वैसे भी अनुपयोगी होगा।
-
मैंने इसे कफ से लिखा है। मैंने कोई त्रुटि प्रबंधन नहीं किया और कुछ अन्य ढिलाई हो सकती है, खासकर जब से मैं अक्सर कर्सर का उपयोग नहीं करता। उदाहरण के लिए, मुझे लगता है कि कॉलम कर्सर को हर बार बंद करने/हटाने/फिर से बनाने के बजाय ताज़ा करने का एक तरीका है।
यदि आप डेटाबेस को नहीं समझ सकते हैं या यह नहीं जानते हैं कि सामान कहाँ से आ रहा है, तो आपको शायद किसी ऐसे व्यक्ति को ढूंढना चाहिए जो ऐसा करता हो। यहां तक कि अगर आप यह पता लगा सकते हैं कि डेटा कहां है, तो इसे कहीं न कहीं डुप्लिकेट किया जा सकता है या डेटाबेस के अन्य पहलू भी हो सकते हैं जिन्हें आप नहीं समझते हैं। अगर आपकी कंपनी में कोई भी डेटाबेस को नहीं समझता है तो आप बहुत बड़ी गड़बड़ी में हैं।
DECLARE
@search_string VARCHAR(100),
@table_name SYSNAME,
@table_schema SYSNAME,
@column_name SYSNAME,
@sql_string VARCHAR(2000)
SET @search_string = 'Test'
DECLARE tables_cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
OPEN tables_cur
FETCH NEXT FROM tables_cur INTO @table_schema, @table_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE columns_cur CURSOR FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @table_schema AND TABLE_NAME = @table_name AND COLLATION_NAME IS NOT NULL -- Only strings have this and they always have it
OPEN columns_cur
FETCH NEXT FROM columns_cur INTO @column_name
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql_string = 'IF EXISTS (SELECT * FROM ' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ' WHERE ' + QUOTENAME(@column_name) + ' LIKE ''%' + @search_string + '%'') PRINT ''' + QUOTENAME(@table_schema) + '.' + QUOTENAME(@table_name) + ', ' + QUOTENAME(@column_name) + ''''
EXECUTE(@sql_string)
FETCH NEXT FROM columns_cur INTO @column_name
END
CLOSE columns_cur
DEALLOCATE columns_cur
FETCH NEXT FROM tables_cur INTO @table_schema, @table_name
END
CLOSE tables_cur
DEALLOCATE tables_cur