একটি ডাটাবেসের যে কোনও জায়গায় মান সন্ধান করুন


253

একটি # দেওয়া, আমি কী টেবিল এবং কলামের মধ্যে এটি খুঁজে পেতে পারি তা আবিষ্কার করব?

আমি দ্রুত এটি যত্নশীল না, এটি কাজ করা প্রয়োজন।


1
আপনি একটি নির্দিষ্ট সংখ্যার জন্য সমস্ত কলাম / সারি অনুসন্ধান করতে চান? আপনি এটি সংখ্যার কলামগুলিতে সীমাবদ্ধ করতে পারেন? পূর্ণসংখ্যা কলামগুলি? পরিচয় কলাম?
মাইকেল হরেন

1
সমস্ত কলামগুলি সেরা হবে, তবে সংখ্যাসূচক কাজটি হবে। পরিচয় কলাম খুব নির্দিষ্ট
Allain Lalonde

1
ডাটাবেস থেকে মেটাডেটা (এই ক্ষেত্রে সারণী / কলামগুলির একটি তালিকা) জিজ্ঞাসা করার জন্য আপনাকে একটি সংক্ষিপ্ত স্ক্রিপ্ট লিখতে হবে এবং মানটির সন্ধানের জন্য নির্বাচিত বিবৃতিগুলির একটি সিরিজ ইস্যু করতে হবে।
ড্রিমন

9
এটি প্রাচীন, তবে কেন কেবল একটি ডাম্প এবং ডাম্প গ্রেপ করবেন না?
baordog

3
phpmyadmin এটিকে খুব সহজভাবে অনুমতি দেয়
মাতোয়েল

উত্তর:


284

এটি আপনাকে সাহায্য করতে পারে । - নারায়ণ ব্যাস থেকে। এটি প্রদত্ত ডাটাবেসে সমস্ত টেবিলের সমস্ত কলাম অনুসন্ধান করে। আমি এটি আগে ব্যবহার করেছি এবং এটি কাজ করে।

এটি উপরের লিঙ্কটি থেকে সঞ্চিত প্রকট - আমি কেবলমাত্র পরিবর্তনটি টেবিলের ভেরিয়েবলের জন্য টেম্প টেবিলটি প্রতিস্থাপন করছিলাম যাতে আপনার এটি প্রতিবার ফেলে দেওয়ার কথা মনে রাখবেন না।

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

DECLARE @Results TABLE(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

17
এফওয়াইআই এই স্ক্রিপ্টটি কেবল নম্বর ক্ষেত্র নয়, পাঠ্য ক্ষেত্র অনুসন্ধান করে। আমার ক্ষেত্রে এটি কাজ করেছিল কারণ ডেভগুলি একটি বার্চারে একটি সংখ্যা সঞ্চয় করছিল, তবে সাধারণত সংখ্যাগুলি খুঁজে পাওয়া কাজ করবে না।
আল্লায় লালনোদে

1
আমরা কি কোনও সঞ্চিত পদ্ধতি ব্যবহারের পরিবর্তে একটি একক কোয়েরি ব্যবহার করে এটি করতে পারি?
ফ্রেইকুইজার

6
কেউ কীভাবে একটি সাধারণ স্কয়ার প্রক্রিয়া কপিরাইট করতে পারে? এটি আমাকে বিস্মিত করে
ডেভিড আন্দ্রে নেড

3
@ ডেভিডআন্দ্রেইনয়েড, তিনি পারেননি, কমপক্ষে তাঁর মতো কোনও উপায় নেই। আমি নিশ্চিত না যে এটি ২০০৯ সালে ফিরে এসেছিল, তবে আজকাল, উত্তরগুলি সিসি-বাই-এসএ ৩.০
আর্তুরো টরেস সানচেজ

2
স্ক্রিপ্টটিতে আমি যে স্ট্রিংটি সন্ধান করতে চাই তা কোথায় রাখব? @ SearchStr2 সেট?
র্যান্ডি কোয়েরার্স

77

আপনার যদি এই জাতীয় অনুসন্ধান কেবল একবার চালাতে হয় তবে আপনি সম্ভবত অন্যান্য উত্তরে ইতিমধ্যে প্রদর্শিত স্ক্রিপ্টগুলির সাথে যেতে পারেন। তবে অন্যথায়, আমি এর জন্য অ্যাপেক্সএসকিউএল অনুসন্ধান ব্যবহার করার পরামর্শ দেব । এটি একটি ফ্রি এসএসএমএস অ্যাডিন এবং এটি সত্যিই আমার অনেক সময় সাশ্রয় করেছে।

যে কোনও স্ক্রিপ্ট চালানোর আগে আপনার অনুসন্ধান করতে চান এমন ডেটা টাইপের ভিত্তিতে এটিকে কাস্টমাইজ করা উচিত। আপনি যদি জানেন যে আপনি ডেটটাইম কলাম অনুসন্ধান করছেন তবে এনভারচর কলামগুলির মাধ্যমে অনুসন্ধান করার দরকার নেই। এটি উপরের সমস্ত প্রশ্নের গতি বাড়িয়ে তুলবে।


1
এটি কোথায় করতে হবে তা নির্ধারণ করতে আমাকে কিছুটা সময় নিল, যে কেউ এই মন্তব্যটি পড়ছেন এটি গ্রহণযোগ্য উত্তর থেকে এই টুকরোটি পরিবর্তন করে কোয়েরিতে করা যেতে পারে: এবং ডেটা_ওয়াইপি ইন ('চর', 'বর্ণচর', 'এনচার', 'এনভারচর) ')
টেলর ব্রাউন

অ্যাপেক্সএসকিউএল অনুসন্ধান একটি দুর্দান্ত সরঞ্জাম। আমি মনে করি এটি শীর্ষস্থানীয় উত্তর হওয়া উচিত কারণ একটি সরঞ্জাম একটি বিমূর্ত ধারণা যা নোংরা স্ক্রিপ্টগুলির সাথে জড়িত না।
দরকারী

আরও মনে রাখবেন যে অ্যাপেক্সএসকিউএল আপনাকে তাদের কয়েকটি সরঞ্জামের জন্য অর্থ প্রদান করার সময়, এটি একটি নিখরচায়। আপনাকে কেবল তাদের আপনার ইমেল দিতে হবে। একটি দুর্দান্ত সরঞ্জাম,
অনির্ধারিত

এটি শীর্ষ উত্তর হতে হবে, আইএমএইচও। বিভিন্ন ডেটাটাইপগুলিতে ফিল্টার করার ক্ষমতা দুর্দান্ত। আমার সম্পর্কে কেবল গ্রিপ, এটি হ'ল "কী টেবিলগুলি সন্ধান করতে হবে" নির্বাচন / ডি-সিলেক্ট করার জন্য জিইউআই হ'ল নো চেক / আনচেক-সব বিকল্প বা বহু-নির্বাচন-এবং-টগল ক্ষমতা সহ একটি চেকবক্স-তালিকা । সুতরাং আপনি যদি বলতে চান যে সমস্ত সিস্টেম অবজেক্টগুলি (যা ডিফল্টরূপে * পরীক্ষিত * যা নির্বোধ) অচিহ্নিত হয়, আপনার একটি স্পেস-অ্যারোডাউন-স্পেস-অ্যারোডাউন * অ্যাড-নসোমাম * ব্যায়ামের মধ্য দিয়ে যেতে হবে । তবে ধন্যবাদ, এটি যথেষ্ট দক্ষ যা আপনার দরকার নেই। কেবল এটি অনুসন্ধান এবং এটির কাজটি করতে দিন!
নাটজে

অ্যাপেক্সএসকিউএল অনুসন্ধান অবশ্যই সেরা সমাধান। আমি কেবল একটি ডাটাবেসে ইমেল ঠিকানাগুলি খুঁজতে স্ক্রিপ্টটি ব্যবহার করার চেষ্টা করেছি - 8:30 মিনিট পরে, আমি হাল ছেড়ে দিয়েছি। অ্যাপেক্সএসকিউএল অনুসন্ধান ইনস্টল করার পরে, আমি ঠিক একই স্ট্রিংটির জন্য অনুসন্ধান করেছি এবং এটি 11 টি টেবিলের মধ্যে এটি 31 বার পাওয়া গেছে। আমি এটি সঠিকভাবে সময়
সাইবারস্কি

74

বিএনকেদেবের উত্তরের ভিত্তিতে আমি সমস্ত কলাম এমনকি সংখ্যাসমূহ অনুসন্ধান করতে নারায়ণের কোডটি সংশোধন করেছি ।

এটি ধীরে ধীরে চলবে, তবে এই সংস্করণটি সমস্ত পাঠকে কেবল টেক্সট কলামগুলিতে পাওয়া মেলেনি।

আমি এই ছেলেটিকে যথেষ্ট ধন্যবাদ জানাতে পারি না। আমাকে হাত ধরে অনুসন্ধানের দিন বাঁচিয়েছে!

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 QUOTENAME(COLUMN_NAME) > @ColumnName
        )

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

SELECT ColumnName, ColumnValue FROM #Results
END

5
"স্বতন্ত্র পরিচয়দাতার মানটিকে চরে রূপান্তর করতে অপর্যাপ্ত ফলাফলের স্থান" সম্বোধন করতে সম্পাদিত error এটি এখন এক্সএমএল কলামগুলির জন্যও কাজ করবে।
ক্রিস

1
এখানে একটি নতুন তথ্য রয়েছে: ডেটা ধরণের চিত্র থেকে বর্ণচর্চায় (সর্বাধিক) রূপান্তর অনুমোদিত নয়। আমি নিজেই এটি চেষ্টা করার চেষ্টা করছি এবং যদি কেউ আমাকে মারধর করে তবে আমাকে জানান, ধন্যবাদ!
টেলর ব্রাউন

5
ঠিক আছে, আমি কেবল kd7 এর কোড থেকে কেবলমাত্র তথ্য প্রকারের সন্ধানের জন্য একটি টুকরো পুনরায় যুক্ত করেছি যা আমার সন্ধানের ফলে ত্রুটিটি অদৃশ্য হয়ে যাওয়ার কারণে সেই চিত্রগুলির কলামগুলি বাদ রাখবে ... এবং ডেটা_প্লে নয় ('চিত্র')
টেইলর ব্রাউন

1
এসকিউএল সার্ভার ২০১৪
চেতন মেহরা

বিভিন্ন ভেরিয়েবল ধরণের জন্য আপনার আলাদা আলাদা সংস্করণ থাকতে পারে। এইভাবে আপনি কাস্টিং করছেন না এবং এটি আরও দ্রুত চলবে। আপনি কাস্ট-সক্ষম প্রকার অনুসন্ধানের সাথে ফাইলের প্রকারগুলিও তুলনা করতে পারেন। একটি পূর্ণসংখ্যা একটি বার্চারের ক্ষেত্রে হতে পারে।
এসকিউএলম্যাসন

38

আমি নিজের কাজের জন্য যে প্রশ্নটি ব্যবহার করি এটি এটি আমার স্বাধীন গ্রহণ take এটি এসকিউএল 2000 এবং আরও বেশি ক্ষেত্রে কাজ করে, ওয়াইল্ডকার্ড, কলাম ফিল্টারিংয়ের অনুমতি দেয় এবং বেশিরভাগ সাধারণ ডেটা ধরণের অনুসন্ধান করবে।

একটি সিউডো-কোড বর্ণনা হতে পারে select * from * where any like 'foo'

--------------------------------------------------------------------------------
-- Search all columns in all tables in a database for a string.
-- Does not search: image, sql_variant or user-defined types.
-- Exact search always for money and smallmoney; no wildcards for matching these.
--------------------------------------------------------------------------------
declare @SearchTerm nvarchar(4000) -- Can be max for SQL2005+
declare @ColumnName sysname

--------------------------------------------------------------------------------
-- SET THESE!
--------------------------------------------------------------------------------
set @SearchTerm = N'foo' -- Term to be searched for, wildcards okay
set @ColumnName = N'' -- Use to restrict the search to certain columns, wildcards okay, null or empty string for all cols
--------------------------------------------------------------------------------
-- END SET
--------------------------------------------------------------------------------

set nocount on

declare @TabCols table (
      id int not null primary key identity
    , table_schema sysname not null
    , table_name sysname not null
    , column_name sysname not null
    , data_type sysname not null
)
insert into @TabCols (table_schema, table_name, column_name, data_type)
    select t.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
    from INFORMATION_SCHEMA.TABLES t
        join INFORMATION_SCHEMA.COLUMNS c on t.TABLE_SCHEMA = c.TABLE_SCHEMA
            and t.TABLE_NAME = c.TABLE_NAME
    where 1 = 1
        and t.TABLE_TYPE = 'base table'
        and c.DATA_TYPE not in ('image', 'sql_variant')
        and c.COLUMN_NAME like case when len(@ColumnName) > 0 then @ColumnName else '%' end
    order by c.TABLE_NAME, c.ORDINAL_POSITION

declare
      @table_schema sysname
    , @table_name sysname
    , @column_name sysname
    , @data_type sysname
    , @exists nvarchar(4000) -- Can be max for SQL2005+
    , @sql nvarchar(4000) -- Can be max for SQL2005+
    , @where nvarchar(4000) -- Can be max for SQL2005+
    , @run nvarchar(4000) -- Can be max for SQL2005+

while exists (select null from @TabCols) begin

    select top 1
          @table_schema = table_schema
        , @table_name = table_name
        , @exists = 'select null from [' + table_schema + '].[' + table_name + '] where 1 = 0'
        , @sql = 'select ''' + '[' + table_schema + '].[' + table_name + ']' + ''' as TABLE_NAME, * from [' + table_schema + '].[' + table_name + '] where 1 = 0'
        , @where = ''
    from @TabCols
    order by id

    while exists (select null from @TabCols where table_schema = @table_schema and table_name = @table_name) begin

        select top 1
              @column_name = column_name
            , @data_type = data_type
        from @TabCols
        where table_schema = @table_schema
            and table_name = @table_name
        order by id

        -- Special case for money
        if @data_type in ('money', 'smallmoney') begin
            if isnumeric(@SearchTerm) = 1 begin
                set @where = @where + ' or [' + @column_name + '] = cast(''' + @SearchTerm + ''' as ' + @data_type + ')' -- could also cast the column as varchar for wildcards
            end
        end
        -- Special case for xml
        else if @data_type = 'xml' begin
            set @where = @where + ' or cast([' + @column_name + '] as nvarchar(max)) like ''' + @SearchTerm + ''''
        end
        -- Special case for date
        else if @data_type in ('date', 'datetime', 'datetime2', 'datetimeoffset', 'smalldatetime', 'time') begin
            set @where = @where + ' or convert(nvarchar(50), [' + @column_name + '], 121) like ''' + @SearchTerm + ''''
        end
        -- Search all other types
        else begin
            set @where = @where + ' or [' + @column_name + '] like ''' + @SearchTerm + ''''
        end

        delete from @TabCols where table_schema = @table_schema and table_name = @table_name and column_name = @column_name

    end

    set @run = 'if exists(' + @exists + @where + ') begin ' + @sql + @where + ' print ''' + @table_name + ''' end'
    print @run
    exec sp_executesql @run

end

set nocount off

আমি এটিকে প্রাক ফর্মে রাখি না যেহেতু আমি শত শত ডিবি জুড়ে এটি রক্ষণ করতে চাই না এবং এটি সত্যিই অ্যাড-হক কাজের জন্য work বাগ-ফিক্স সম্পর্কে বিনা দ্বিধায় দয়া করে


ধন্যবাদ, তবে আমি পিএইচপিএমআইএডমিনে সিনট্যাক্স ত্রুটি ছাড়া কিছুই পাচ্ছি না। এসকিউএল লেখা হওয়ার পর থেকে কি কিছু পরিবর্তন হয়েছে?
NoBugs

3
@ NoBugs এটি এসকিউএল সার্ভারের জন্য টি-এসকিউএল এ লেখা হয়েছে।
টিম লেহনার

@ নোব্যাগস: আপনার নিজের সঞ্চিত প্রক্রিয়া বা অন্য কোনও ফাংশনের অভ্যন্তরে কোডটি আপনার প্রয়োজন হবে।
Fandango68

2
কেবলমাত্র আউটপুট স্পষ্ট করার জন্য, যদি মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও থেকে এটি চালানো হয় তবে অনুসন্ধানের শব্দটি পাওয়া গেলে ফলাফলগুলি ট্যাবটি কেবল উন্মুক্ত হবে। যদি অনুসন্ধান শব্দটি পাওয়া না যায় তবে কেবলমাত্র বার্তাগুলি ট্যাব সম্পাদিত অনুসন্ধানের বিবৃতি দিয়ে খোলা হবে। বার্তা ট্যাবটিতে কোনও ফলাফল অন্তর্ভুক্ত নয় তবে অনুসন্ধানের শব্দটি পাওয়া গেলে ফলাফল ট্যাবের পাশাপাশি খুলবে।
গেকেরা

1
এটা অসাধারণ! ক্রয় করা অ্যাপের সাথে কাজ করা যেখানে আমি কাস্টম ডেটাবেস অবজেক্টগুলিকে তাদের স্কিমে সংরক্ষণ করতে চাই না। ধন্যবাদ!
জেফ

20

আমি আল্লাইন লালোন্ডের উত্তরটি ( https://stackoverflow.com/a/436676/412368 ) অপ্টিমাইজ করেছি । সংখ্যাযুক্ত মানগুলি এখনও সমর্থিত। প্রায় 4-5 গুণ দ্রুত হওয়া উচিত (1:03 বনাম 4:30), একটি 7 গিগাবাইট ডাটাবেস সহ একটি ডেস্কটপে পরীক্ষিত tested http://developer.azurewebsites.net/2015/01/mssql-searchalltables/

IF OBJECT_ID ('dbo.SearchAllTables', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.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
-- Site: http://vyaskn.tripod.com
-- Customized and modified: 2014-01-21
-- Tested on: SQL Server 2008 R2

DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256)
DECLARE @ColumnName nvarchar(128)
DECLARE @DataType nvarchar(128)

DECLARE @SearchStr2 nvarchar(110)
DECLARE @SearchDecimal decimal(38,19)
DECLARE @Query nvarchar(4000)
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%', '''')
SET @SearchDecimal = CASE WHEN ISNUMERIC(@SearchStr) = 1 THEN CONVERT(decimal(38,19), @SearchStr) ELSE NULL END
PRINT '@SearchStr2: ' + @SearchStr2
PRINT '@SearchDecimal: ' + CAST(@SearchDecimal AS nvarchar)

SET @TableName = ''
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))
                    DATA_TYPE
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar',
                                  'int', 'bigint', 'tinyint', 'numeric', 'decimal')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )
        SET @DataType =
        (
            SELECT DATA_TYPE
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND QUOTENAME(COLUMN_NAME) = @ColumnName
        )
        PRINT @TableName + '.' + @ColumnName + ' (' + @DataType + ')'

        IF @ColumnName IS NOT NULL
        BEGIN
            IF @DataType IN ('int', 'bigint', 'tinyint', 'numeric', 'decimal')
            BEGIN
                IF @SearchDecimal IS NOT NULL
                BEGIN
                    SET @Query = 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(CAST(' + @ColumnName + ' AS nvarchar(110)), 3630) ' +
                                 'FROM ' + @TableName + ' (NOLOCK) ' +
                                 ' WHERE ' + @ColumnName + ' = ' + CAST(@SearchDecimal AS nvarchar)
                    PRINT '    ' + @Query
                    INSERT INTO @Results
                    EXEC (@Query)
                END
            END
            ELSE
            BEGIN
                SET @Query = 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) ' +
                             'FROM ' + @TableName + ' (NOLOCK) ' +
                             ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                PRINT '    ' + @Query
                INSERT INTO @Results
                EXEC (@Query)
            END
        END
    END 
END

SELECT ColumnName, ColumnValue FROM @Results
END

5

এই প্রশ্নটি সমাধান করার আমার উপায়। SQLServer2008R2 এ পরীক্ষিত

CREATE PROC SearchAllTables
@SearchStr nvarchar(100)
AS
BEGIN
DECLARE @dml nvarchar(max) = N''        
IF OBJECT_ID('tempdb.dbo.#Results') IS NOT NULL DROP TABLE dbo.#Results
CREATE TABLE dbo.#Results
 ([tablename] nvarchar(100), 
  [ColumnName] nvarchar(100), 
  [Value] nvarchar(max))  
SELECT @dml += ' SELECT ''' + s.name + '.' + t.name + ''' AS [tablename], ''' + 
                c.name + ''' AS [ColumnName], CAST(' + QUOTENAME(c.name) + 
               ' AS nvarchar(max)) AS [Value] FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) +
               ' (NOLOCK) WHERE CAST(' + QUOTENAME(c.name) + ' AS nvarchar(max)) LIKE ' + '''%' + @SearchStr + '%'''
FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id
                   JOIN sys.columns c ON t.object_id = c.object_id
                   JOIN sys.types ty ON c.system_type_id = ty.system_type_id AND c .user_type_id = ty .user_type_id
WHERE t.is_ms_shipped = 0 AND ty.name NOT IN ('timestamp', 'image', 'sql_variant')

INSERT dbo.#Results
EXEC sp_executesql @dml

SELECT *
FROM dbo.#Results
END

4

সত্যিই দরকারী স্ক্রিপ্ট জন্য ধন্যবাদ।

আপনার টেবিলগুলির অ-রূপান্তরযোগ্য ক্ষেত্রগুলি থাকলে আপনার কোডটিতে নিম্নলিখিত সংশোধনটি যুক্ত করতে হতে পারে:

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 NOT IN ('text', 'image', 'ntext')                 
            AND QUOTENAME(COLUMN_NAME) > @ColumnName
    )

ক্রিস


3

কিছুক্ষণ আগে থেকেই আমার একটি সমাধান রয়েছে যা আমি উন্নতি করে চলেছি। এটি করার কথা বলা হলে এক্সএমএল কলামগুলির মধ্যেও অনুসন্ধান করে বা একটি পূর্ণসংখ্যা কেবল স্ট্রিং সরবরাহ করে যদি পূর্ণসংখ্যার মানগুলি অনুসন্ধান করে।

/* Reto Egeter, fullparam.wordpress.com */

DECLARE @SearchStrTableName nvarchar(255), @SearchStrColumnName nvarchar(255), @SearchStrColumnValue nvarchar(255), @SearchStrInXML bit, @FullRowResult bit, @FullRowResultRows int
SET @SearchStrColumnValue = '%searchthis%' /* use LIKE syntax */
SET @FullRowResult = 1
SET @FullRowResultRows = 3
SET @SearchStrTableName = NULL /* NULL for all tables, uses LIKE syntax */
SET @SearchStrColumnName = NULL /* NULL for all columns, uses LIKE syntax */
SET @SearchStrInXML = 0 /* Searching XML data may be slow */

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
CREATE TABLE #Results (TableName nvarchar(128), ColumnName nvarchar(128), ColumnValue nvarchar(max),ColumnType nvarchar(20))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256) = '',@ColumnName nvarchar(128),@ColumnType nvarchar(20), @QuotedSearchStrColumnValue nvarchar(110), @QuotedSearchStrColumnName nvarchar(110)
SET @QuotedSearchStrColumnValue = QUOTENAME(@SearchStrColumnValue,'''')
DECLARE @ColumnNameTable TABLE (COLUMN_NAME nvarchar(128),DATA_TYPE nvarchar(20))

WHILE @TableName IS NOT NULL
BEGIN
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_NAME LIKE COALESCE(@SearchStrTableName,TABLE_NAME)
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
)
IF @TableName IS NOT NULL
BEGIN
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT QUOTENAME(COLUMN_NAME),DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(''' + @TableName + ''', 2)
AND TABLE_NAME = PARSENAME(''' + @TableName + ''', 1)
AND DATA_TYPE IN (' + CASE WHEN ISNUMERIC(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@SearchStrColumnValue,'%',''),'_',''),'[',''),']',''),'-','')) = 1 THEN '''tinyint'',''int'',''smallint'',''bigint'',''numeric'',''decimal'',''smallmoney'',''money'',' ELSE '' END + '''char'',''varchar'',''nchar'',''nvarchar'',''timestamp'',''uniqueidentifier''' + CASE @SearchStrInXML WHEN 1 THEN ',''xml''' ELSE '' END + ')
AND COLUMN_NAME LIKE COALESCE(' + CASE WHEN @SearchStrColumnName IS NULL THEN 'NULL' ELSE '''' + @SearchStrColumnName + '''' END + ',COLUMN_NAME)'
INSERT INTO @ColumnNameTable
EXEC (@sql)
WHILE EXISTS (SELECT TOP 1 COLUMN_NAME FROM @ColumnNameTable)
BEGIN
PRINT @ColumnName
SELECT TOP 1 @ColumnName = COLUMN_NAME,@ColumnType = DATA_TYPE FROM @ColumnNameTable
SET @sql = 'SELECT ''' + @TableName + ''',''' + @ColumnName + ''',' + CASE @ColumnType WHEN 'xml' THEN 'LEFT(CAST(' + @ColumnName + ' AS nvarchar(MAX)), 4096),'''
WHEN 'timestamp' THEN 'master.dbo.fn_varbintohexstr('+ @ColumnName + '),'''
ELSE 'LEFT(' + @ColumnName + ', 4096),''' END + @ColumnType + '''
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + CASE @ColumnType WHEN 'xml' THEN 'CAST(' + @ColumnName + ' AS nvarchar(MAX))'
WHEN 'timestamp' THEN 'master.dbo.fn_varbintohexstr('+ @ColumnName + ')'
ELSE @ColumnName END + ' LIKE ' + @QuotedSearchStrColumnValue
INSERT INTO #Results
EXEC(@sql)
IF @@ROWCOUNT > 0 IF @FullRowResult = 1
BEGIN
SET @sql = 'SELECT TOP ' + CAST(@FullRowResultRows AS VARCHAR(3)) + ' ''' + @TableName + ''' AS [TableFound],''' + @ColumnName + ''' AS [ColumnFound],''FullRow>'' AS [FullRow>],*' +
' FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + CASE @ColumnType WHEN 'xml' THEN 'CAST(' + @ColumnName + ' AS nvarchar(MAX))'
WHEN 'timestamp' THEN 'master.dbo.fn_varbintohexstr('+ @ColumnName + ')'
ELSE @ColumnName END + ' LIKE ' + @QuotedSearchStrColumnValue
EXEC(@sql)
END
DELETE FROM @ColumnNameTable WHERE COLUMN_NAME = @ColumnName
END 
END
END
SET NOCOUNT OFF

SELECT TableName, ColumnName, ColumnValue, ColumnType, COUNT(*) AS Count FROM #Results
GROUP BY TableName, ColumnName, ColumnValue, ColumnType

সূত্র: http://fullparam.wordpress.com/2012/09/07/fck-it-i-am-oming-to-search-all-tables-all-collouts/


এটিই ছিল একমাত্র উত্তর যা আমার সুবিধাগুলি নিয়ে কাজ করেছিল, কেবল স্ট্রিংই অনুসন্ধান করেছিল না এবং আমার টেবিলগুলির সাথেও ভাঙা হয়নি।
পেদ্রো লেসারদা


2

এখানে, খুব মিষ্টি এবং ছোট সমাধান:

1) create a store procedure:

create procedure get_table
@find_str varchar(50)
as 
begin
  declare @col_name varchar(500), @tab_name varchar(500);
  declare @find_tab TABLE(table_name varchar(100), column_name varchar(100));

  DECLARE tab_col cursor for 
  select C.name as 'col_name', T.name as tab_name
  from sys.tables as T
  left outer join sys.columns as C on  C.object_id=T.object_id
  left outer join sys.types as TP on  C.system_type_id=TP.system_type_id
  where type='U' 
  and TP.name in('text','ntext','varchar','char','nvarchar','nchar');

  open tab_col
  fetch next from tab_col into @col_name, @tab_name

  while @@FETCH_STATUS = 0
  begin        
    insert into @find_tab 
    exec('select ''' +  @tab_name + ''',''' + @col_name + ''' from ' + @tab_name + 
    ' where ' + @col_name + '=''' + @find_str + ''' group by ' + 
    @col_name + ' having count(*)>0');

    fetch next from tab_col into @col_name, @tab_name;
  end
  CLOSE tab_col;  
  DEALLOCATE tab_col; 
  select table_name, column_name from @find_tab;

end

==========================

2) call procedure by calling store procedure:
exec get_table 'serach_string';

1

জোইন এবং কার্সর ব্যবহারের অন্য উপায়:

USE My_Database;

-- Store results in a local temp table so that.  I'm using a
-- local temp table so that I can access it in SP_EXECUTESQL.
create table #tmp (
    tbl nvarchar(max),
    col nvarchar(max),
    val nvarchar(max)   
);

declare @tbl nvarchar(max);
declare @col nvarchar(max);
declare @q nvarchar(max);
declare @search nvarchar(max) = 'my search key';

-- Create a cursor on all columns in the database
declare c cursor for
SELECT tbls.TABLE_NAME, cols.COLUMN_NAME  FROM INFORMATION_SCHEMA.TABLES AS tbls
JOIN INFORMATION_SCHEMA.COLUMNS AS cols
ON tbls.TABLE_NAME = cols.TABLE_NAME

-- For each table and column pair, see if the search value exists.
open c
fetch next from c into @tbl, @col
while @@FETCH_STATUS = 0
begin
    -- Look for the search key in current table column and if found add it to the results.
    SET @q = 'INSERT INTO #tmp SELECT ''' + @tbl + ''', ''' + @col + ''', ' + @col + ' FROM ' + @tbl + ' WHERE ' + @col + ' LIKE ''%' + @search + '%'''
    EXEC SP_EXECUTESQL @q
    fetch next from c into @tbl, @col
end
close c
deallocate c

-- Get results
select * from #tmp

-- Remove local temp table.
drop table #tmp


1

মনে করুন আপনি যদি নাম সহ সমস্ত টেবিল পেতে চান তবে নীচে মাই ডেটাবেস ডাটাবেসে একটি কলামের নামটিতে লগইনটাইম রয়েছে

    use MyDatabase

    SELECT t.name AS table_name,
    SCHEMA_NAME(schema_id) AS schema_name,
    c.name AS column_name
    FROM sys.tables AS t
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
    WHERE c.name LIKE '%logintime%'
    ORDER BY schema_name, table_name;

1

আপনি যদি পিএইচপিএমওয়াই অ্যাডমিন ইনস্টল করে থাকেন তবে এর অনুসন্ধানটি ব্যবহার করুন বৈশিষ্ট্যটি ।

আপনার ডেটাবেস নির্বাচন করুন।

আপনি কোনও টেবিল নয়, ডাটাবেস নির্বাচন করেছেন তা নিশ্চিত হয়ে নিন, অন্যথায় আপনি সম্পূর্ণ আলাদা অনুসন্ধান ডায়ালগ পাবেন।

  1. অনুসন্ধান ট্যাবে ক্লিক করুন
  2. তালিকা আইটেম আপনি চান অনুসন্ধান শব্দটি চয়ন করুন
  3. সারণী সারণী চয়ন করুন

0
-- exec pSearchAllTables 'M54*'

ALTER PROC pSearchAllTables (@SearchStr NVARCHAR(100))
AS
BEGIN
    -- A procedure to search all tables in a database for a value
    -- Note: Use * or % for wildcard

    DECLARE 
        @Results TABLE([Schema.Table.ColumnName] NVARCHAR(370), ColumnValue NVARCHAR(3630))

    SET NOCOUNT ON

    DECLARE 
        @TableName NVARCHAR(256) = ''
        , @ColumnName NVARCHAR(128)     
        , @SearchStr2 NVARCHAR(110) = QUOTENAME(REPLACE(@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 
        [Schema.Table.ColumnName]
        , ColumnValue 
    FROM @Results
    GROUP BY 
        [Schema.Table.ColumnName]
        , ColumnValue 

END

আমি কীভাবে এটি কাজ করে তা পরিষ্কার নয়। দেখে মনে হচ্ছে এখানে 2 টি অনুসন্ধানের স্ট্রিং রয়েছে, বা কোনও অনুসন্ধান এবং প্রতিস্থাপনের স্ট্রিং রয়েছে? আমি যদি কেবল অনুসন্ধান করতে চাই তবে আমি যে স্ট্রিংটি সন্ধান করছি তা কোথায় রাখব?
শেরিলহোমান

0

বিকাশের উদ্দেশ্যে আপনি কেবলমাত্র একক এইচটিএমএলে প্রয়োজনীয় টেবিলগুলি ডেটা রফতানি করতে পারেন এবং এটিতে সরাসরি অনুসন্ধান করতে পারেন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.