خانه > Persian Contents, SQL Server, T-SQL > جستجوی تمامی جداول یک پایگاه داده برای یافتن یک مقدار مورد نظر

جستجوی تمامی جداول یک پایگاه داده برای یافتن یک مقدار مورد نظر

چند وقتی بود که به دنبال راهی برای جستجو کردن جداول یک database برای یافتن یک مقدار خاص میگشتم. یک راه به نظر خودم میرسید و آن این بود که واقعا می آمدم و یک foreach روی تمام جداول database میزدم و به دنبال مقدار مورد نظر خودم میشگتم. اما به نظرم آمد که شاید راه حل بهتری هم موجود باشد، به همین دلیل بود که روی اینترنت یک جستجوی مختصر کردم و به نتایج جالب زیر رسیدم :
شما میتوانید یک stored procedure بسازید که محتوای آن در ادامه بیان میشود. این ساختار یک رشته را به عنوان ورودی دریافت میکند و آن را به عنوان کلمه مورد جستجو در نظر میگیرد. سپس روی تمام ستونهای از نوع char، varchar، nchar و nvarchar موجود در جداول database جستجو میکند (البته روی جداول سیستمی این کار ار انجام نمیدهد) و دنبال نتایج مورد نظر میگردد. در ضمن میتوان این stored procedure را برای پشتیبانی از دیگر انواع داده ای گسترش داد.
خروجی این sp دارای دو ستون است :
–    نام جدول و نام ستونی که مقدار مورد نظر در آن پیدا شده
–    محتوای واقعی ستون (البته تا ۳۶۳۰ کاراکتر نمایش داده میشود).

برای استفاده از این sp باید کمی محتاط باشید، زیرا این عملیات روی ساختارهای کوچک بسیار سریع است اما برای ساختارهای بزرگ با تعداد جدول زیاد و حجم داده بالا روی آنها بسیار زمانگیر است. پس اگر میخواهید از آن استفاده کنید بهتر است که قبلا کامل فکرهایخود را انجام دهید. این بهتر که در چنین مواقعی از Full-Text Search استفاده نمایید که این کار هم مشکلات خود را دارد.
اسکریپت زیر روی پایگاه داده Pubs به دنبال کلمه Computer میگردد :

EXEC SearchAllTables ‹Computer›
GO

و این هم کد کامل store procedure میباشد :

CREATE 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

 

امیدوارم که این مطلب به درد دوستان عزیز بخورد.

مرجع

دسته‌ها:Persian Contents, SQL Server, T-SQL
  1. دختر پاییز
    مه 24, 2009 در 12:52 ب.ظ.

    سلام. خسته نباشید. میخواستم بدونم راهی هست که بشه دو وبلاگ رو در یک وبلاگ ادغام کنم؟ من دو وبلاگ دارم.دیگه نمیخوام در هر دو بنویسم.میخوام ببینم میشه یکیشون کرد و در همون یکی به وبلاگ نویسی ادامه بدم یا نه؟لطفا راهنماییم کنید با تشکر.

  2. Melisa
    مه 24, 2009 در 6:00 ب.ظ.

    سلام جناب رمضانی،خسته نباشید…واقعا سایت پر محتوایی دارید…من خودم به شخصه از مطالب سایتتون خیلی استفاده می کنم.امیدوارم همیشه موفق و پیروز باشید..خوشحال می شویم از اطلاعات ارزشمندتون در سایت دانشجویی مرکز آموزش عالی انفورماتیک شرکت داده پردازی ایران استفاده کنیم.آدرس سایت ما:www.DpiGuide.com

  3. Melisa
    مه 24, 2009 در 6:06 ب.ظ.

    در ضمن سایت شما به عنوان بهترین آموزش فارسی  در لینک زیر معرفی شده است..لینک تاپیک:http://forum.dpiguide.com/ftopicp-6182.html#6182موفق باشید..

  4. سلام
    مارس 5, 2010 در 9:15 ب.ظ.

    با تشکر فراوان

  1. No trackbacks yet.

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: