2012-10-10 14 views
13

के साथ कुछ सबस्ट्रिंग के लिए डीबी में सभी टेक्स्ट फ़ील्ड कैसे खोजें, मेरे पास कई सैकड़ों टेबल और कई हजार कॉलम के साथ एक विशाल स्कीमा है। मुझे पता चलेगा कि इस डेटाबेस में कई स्थानों पर एक विशिष्ट आईपी पता संग्रहीत किया जाता है, लेकिन मुझे यकीन नहीं है कि कौन सी तालिका (ओं) या कॉलम इसे संग्रहीत किया जाता है। असल में, मैं हर जगह खोजने की कोशिश कर रहा हूं कि यह आईपी ​​पता डीबी में संग्रहीत किया जाता है, इसलिए मैं इसे उन सभी स्थानों पर एक नए मान में अपडेट कर सकता हूं।टी-एसक्यूएल

तालिका में एक पाठ-कॉलम नाम और मूल्य मुद्रित करने के लिए टी-एसक्यूएल कथन पर मेरी पहली दरार है, जिसमें डेटाबेस में प्रत्येक टेक्स्ट कॉलम के लिए 10.15.13 है।

अब, यह काम करता है, तरह। समस्या यह है कि, जब मैं इसे प्रबंधन स्टूडियो में निष्पादित करता हूं, sp_executesql पर कॉल वास्तव में कुछ भी क्वेरी से सभी रिक्त परिणामों को वापस कर देगा जो कि कुछ भी नहीं लौटाता है (यानी कॉलम में उस सबस्ट्रिंग के साथ कोई रिकॉर्ड नहीं है), और यह परिणाम विंडो भरता है इसके अधिकतम तक, और फिर मैं वास्तव में नहीं देखता कि कुछ भी मुद्रित किया गया था या नहीं।

क्या इस प्रश्न को लिखने का कोई बेहतर तरीका है? या मैं इसे किसी अलग तरीके से चला सकता हूं ताकि यह केवल मुझे टेबल्स और कॉलम दिखाए जहां यह सबस्ट्रिंग मौजूद है?

DECLARE 
    @SchemaName VARCHAR(50), 
    @TableName VARCHAR(50), 
    @ColumnName VARCHAR(50); 
BEGIN 
    DECLARE textColumns CURSOR FOR 
    SELECT s.Name, tab.Name, c.Name 
    FROM Sys.Columns c, Sys.Types t, Sys.Tables tab, Sys.Schemas s 
    WHERE s.schema_id = tab.schema_id AND tab.object_id = c.object_id AND c.user_type_id = t.user_type_id 
    AND t.Name in ('TEXT','NTEXT','VARCHAR','CHAR','NVARCHAR','NCHAR'); 

    OPEN textColumns 

    FETCH NEXT FROM textColumns 
    INTO @SchemaName, @TableName, @ColumnName 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE @sql NVARCHAR(MAX), 
       @ParamDef NVARCHAR(MAX), 
       @result NVARCHAR(MAX);    
     SET @sql = N'SELECT ' + @ColumnName + ' FROM ' + @SchemaName + '.' + @TableName + ' WHERE ' + @ColumnName + ' LIKE ''%10.15.13%'''; 
     SET @ParamDef = N'@resultOut NVARCHAR(MAX) OUTPUT'; 

     EXEC sp_executesql @sql, @ParamDef, @resultOut = @result OUTPUT; 

     PRINT 'Column = ' + @TableName + '.' + @ColumnName + ', Value = ' + @result; 
     FETCH NEXT FROM textColumns 
     INTO @SchemaName, @TableName, @ColumnName  
    END 
    CLOSE textColumns; 
    DEALLOCATE textColumns; 
END 

मैं इस जहां यह तालिका/स्तंभ-स्ट्रिंग में पाया गया था, और उस कॉलम में पूरा मूल्य से पता चलता जैसे परिणाम कुछ देखना चाहते हैं ...

Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo' 
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210' 

आदि

+0

आपका बंद। इस उदाहरण के साथ अपनी तुलना करें: [SQL सर्वर तालिका में सभी कॉलम में एक स्ट्रिंग मान खोजना और ढूंढना] (http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-column-in-a-sql-server-table /) – Jeremy

+0

बहुत बढ़िया धन्यवाद! मैंने वास्तव में लिंक से उस समाधान का उपयोग नहीं किया क्योंकि यह एक समय में एक ही तालिका को खोजने के लिए है, लेकिन डेटाबेस में सभी तालिकाओं को खोजने के लिए इसका एक पूरा समाधान था; बिल्कुल मुझे क्या चाहिए। http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm कृपया इसे एक उत्तर के रूप में पोस्ट करें और मैं इसे सही के रूप में चिह्नित करूंगा! – Jim

+0

मैंने उत्तर और साथ ही साथ लिंक के लिए संदर्भित लिंक भी शामिल किया है। धन्यवाद! – Jeremy

उत्तर

24

आप बंद हैं। How to search all columns of all tables in a database for a keyword?

संपादित करें:: बस के मामले में कड़ी कभी बुरा हो जाता है, यहाँ समाधान है Searching and finding a string value in all columns in a SQL Server table

ऊपर के लिंक एक एकल तालिका खोज के लिए है, लेकिन यहाँ एक और लिंक जो सभी तालिकाओं शामिल हैं: तुम्हारा इस उदाहरण के साथ तुलना करें उस लिंक से ...

CREATE PROC SearchAllTables 
(
    @SearchStr nvarchar(100) 
) 
AS 
BEGIN 

    -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. 
    -- Purpose: To search all columns of all tables for a given search string 
    -- Written by: Narayana Vyas Kondreddi 
    -- Site: http://vyaskn.tripod.com 
    -- Tested on: SQL Server 7.0 and SQL Server 2000 
    -- Date modified: 28th July 2002 22:50 GMT 


    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) 

    SET NOCOUNT ON 

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
    SET @TableName = '' 
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

    WHILE @TableName IS NOT NULL 
    BEGIN 
     SET @ColumnName = '' 
     SET @TableName = 
     (
      SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
      FROM INFORMATION_SCHEMA.TABLES 
      WHERE  TABLE_TYPE = 'BASE TABLE' 
       AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
       AND OBJECTPROPERTY(
         OBJECT_ID(
          QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
          ), 'IsMSShipped' 
           ) = 0 
     ) 

     WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
     BEGIN 
      SET @ColumnName = 
      (
       SELECT MIN(QUOTENAME(COLUMN_NAME)) 
       FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE  TABLE_SCHEMA = PARSENAME(@TableName, 2) 
        AND TABLE_NAME = PARSENAME(@TableName, 1) 
        AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') 
        AND QUOTENAME(COLUMN_NAME) > @ColumnName 
      ) 

      IF @ColumnName IS NOT NULL 
      BEGIN 
       INSERT INTO #Results 
       EXEC 
       (
        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
        FROM ' + @TableName + ' (NOLOCK) ' + 
        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
       ) 
      END 
     END 
    END 

    SELECT ColumnName, ColumnValue FROM #Results 
END 


EXEC SearchAllTables '<yourSubstringHere>' 

नोट: टिप्पणी कोड स्निपेट में पता चलता है रूप में, यह एसक्यूएल सर्वर के पुराने संस्करणों का उपयोग कर परीक्षण किया गया था। यह SQL सर्वर पर काम नहीं कर सकता 2012

+0

-1 मुझे SQL सर्वर 2012 में निम्न त्रुटि मिलती है "संदेश 217, स्तर 16, राज्य 1, प्रक्रिया खोजअल्टटेबल्स, रेखा 54 अधिकतम संग्रहीत प्रक्रिया, फ़ंक्शन, ट्रिगर, या घोंसले के स्तर को पार करने (32 को सीमित करें)।" – codemonkeh

+0

codemonkeh, प्रत्येक निष्पादन के बाद या निष्पादन से पहले ड्रॉप संग्रहित प्रसंस्करण और temp तालिका विवरण जोड़ने के लिए सुनिश्चित करें। – Munawar

+0

SQL सर्वर 2012 में निम्न त्रुटि प्राप्त करें "संदेश 217, स्तर 16, राज्य 1, प्रक्रिया खोजअल्टटेबल्स, रेखा 54 अधिकतम संग्रहीत प्रक्रिया, फ़ंक्शन, ट्रिगर, या घोंसला स्तर को पार करें (सीमा 32)। समान त्रुटि – Jahangeer

0

यह कोशिश यह आप सीमा की त्रुटि नहीं देंगे से अधिक 32

alter PROC SearchAllTables 
(
    @SearchStr nvarchar(100) 
) 
AS 
BEGIN 



    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) 

    SET NOCOUNT ON 

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
    SET @TableName = '' 
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

    WHILE @TableName IS NOT NULL 
    BEGIN 
     SET @ColumnName = '' 
     SET @TableName = 
     (
      SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
      FROM INFORMATION_SCHEMA.TABLES 
      WHERE  TABLE_TYPE = 'BASE TABLE' 
       AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
       AND OBJECTPROPERTY(
         OBJECT_ID(
          QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
          ), 'IsMSShipped' 
           ) = 0 
     ) 

     WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
     BEGIN 
      SET @ColumnName = 
      (
       SELECT MIN(QUOTENAME(COLUMN_NAME)) 
       FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE  TABLE_SCHEMA = PARSENAME(@TableName, 2) 
        AND TABLE_NAME = PARSENAME(@TableName, 1) 
        AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') 
        AND QUOTENAME(COLUMN_NAME) > @ColumnName 
      ) 

      IF @ColumnName IS NOT NULL 
      BEGIN 
       INSERT INTO #Results 
       EXEC 
       (
        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
        FROM ' + @TableName + ' (NOLOCK) ' + 
        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
       ) 
      END 
     END 
    END 

    SELECT ColumnName, ColumnValue FROM #Results 
END 

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

3

चुना जवाब प्रतिभाशाली है, लेकिन मैंने पाया जब इसका बार-बार उपयोग करना गलत था, इसलिए मैंने सटीक परिणामों के साथ इसे फिर से चलाने योग्य बनाने के लिए कुछ साफ किया:

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'SearchAllTables') 
    DROP PROC SearchAllTables 
GO 

CREATE PROC SearchAllTables 
(
    @SearchStr nvarchar(100) 
) 
AS 
BEGIN 

    -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved. 
    -- Purpose: To search all columns of all tables for a given search string 
    -- Written by: Narayana Vyas Kondreddi 
    -- Slightly modified by: Natalie Ford, 6/10/15 
    -- Site: http://vyaskn.tripod.com 
    -- Tested on: SQL Server 7.0 and SQL Server 2000 
    -- Date modified: 28th July 2002 22:50 GMT 

    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) 

    SET NOCOUNT ON 

    TRUNCATE Table #Results 

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
    SET @TableName = '' 
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

    WHILE @TableName IS NOT NULL 
    BEGIN 
     SET @ColumnName = '' 
     SET @TableName = 
     (
      SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
      FROM INFORMATION_SCHEMA.TABLES 
      WHERE  TABLE_TYPE = 'BASE TABLE' 
       AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
       AND OBJECTPROPERTY(
         OBJECT_ID(
          QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
          ), 'IsMSShipped' 
           ) = 0 
     ) 

     WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
     BEGIN 
      SET @ColumnName = 
      (
       SELECT MIN(QUOTENAME(COLUMN_NAME)) 
       FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE  TABLE_SCHEMA = PARSENAME(@TableName, 2) 
        AND TABLE_NAME = PARSENAME(@TableName, 1) 
        AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') 
        AND QUOTENAME(COLUMN_NAME) > @ColumnName 
      ) 

      IF @ColumnName IS NOT NULL 
      BEGIN 
       INSERT INTO #Results 
       EXEC 
       (
        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
        FROM ' + @TableName + ' (NOLOCK) ' + 
        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 
       ) 
      END 
     END 
    END 

    SELECT ColumnName, ColumnValue FROM #Results 

    DROP TABLE #Results 
END 
संबंधित मुद्दे