تم الكتابة في جمادى الثانية 14, 1429 08:50

 

السلام عليكم ورحمة الله وبركاته ...

كما هو في العنوان، نريد ان نبح عن جملة "String" في جدول معين، و لكن المشكلة هي أننا نريد البحث في جميع حقول هذا الجدول و ليس في حقل واحد ... لكي نجعل البحث عام بشكل أكبر ...

الحل هو استخدام الكود التالي، و هو ينشئ Stored Procedure داخل قاعدة البيانات Master باسم sp_FindStringInTable و تقوم هذه الدالة بالبحث عن جمله داخل جدول...

الدالة sp_FindStringInTable تأخذ ثلاثة متغيرات للبحث ... هي:

stringToFind و هي الجملة المراد البحث عنها ...

schema و هي الschema المراد البحث داخلها ...

table و هو الجدول المراد البحث داخله ...

سنقوم كما قلت بانشاء هذه الدالة داخل قاعدة البيانات Master لكي يمكن استخدامها في اي قاعدة بيانات تكون موجودة لديك ...

USE master
GO

CREATE PROCEDURE sp_FindStringInTable @stringToFind VARCHAR(100), @schema sysname, @table sysname
AS

DECLARE @sqlCommand VARCHAR(8000)
DECLARE @where VARCHAR(8000)
DECLARE @columnName sysname
DECLARE @cursor VARCHAR(8000)

BEGIN TRY
   SET @sqlCommand = 'SELECT * FROM ' + @schema + '.' + @table + ' WHERE'
   SET @where = ''

   SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME
   FROM ' + DB_NAME() + '.INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_SCHEMA = ''' + @schema + '''
   AND TABLE_NAME = ''' + @table + '''
   AND DATA_TYPE IN (''char'',''nchar'',''ntext'',''nvarchar'',''text'',''varchar'')'

   EXEC (@cursor)

   OPEN col_cursor  
   FETCH NEXT FROM col_cursor INTO @columnName  

   WHILE @@FETCH_STATUS = 0  
   BEGIN  
       IF @where <> ''
           SET @where = @where + ' OR'

       SET @where = @where + ' ' + @columnName + ' LIKE ''' + @stringToFind + ''''
       FETCH NEXT FROM col_cursor INTO @columnName  
   END  

   CLOSE col_cursor  
   DEALLOCATE col_cursor

   SET @sqlCommand = @sqlCommand + @where
   --PRINT @sqlCommand
   EXEC (@sqlCommand)
END TRY
BEGIN CATCH
   PRINT 'There was an error'
   IF CURSOR_STATUS('variable', 'col_cursor') <> -3
   BEGIN
       CLOSE col_cursor  
       DEALLOCATE col_cursor
   END
END CATCH

الآن هذا الكو قام بانشاء الدالة sp_FindStringInTable .

و لكي نستخدمها من الممك ان نستخدم هذا الكود:

USE AdventureWorks
GO
EXEC sp_FindStringInTable '%land%', 'Person', 'Contact'

و لاحظ أننا استخدمنا علامة % و من الممكن أن نستخدم * أيضاً لتحديد البحث بشكل أكبر ...

 

أتمنىأن تكون هذه الدالة مفيدة ...

نصيحة شخصية: لا تستخدم هذا الأسلوب في البحث إلا في الضرورة القصوى، حاول أن تستخدم بحث محدد في حقول و جداول محددة و ذلك لرفع كفائة الإستعلام Query الذي تكتبه.

إن كنت تريد البحث باللغة العربية استبدل varchar بـ nvarchar.

 

طلال الحضبي.

المصدر: MSSQLTips.com

Del.icio.usDigg It!DZone It!Reddit

التصنيف: SQL Server , قواعد البيانات
البطاقات: ,

اضف تعليق


(سيظهر Gravatar أيقونة)  

  Country flag

biuquote
  • تعليق
  • استعراض
Loading



Sign in