كيف تبحث عن جمله (String) في جميع حقول جدول في SQL Server؟

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

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

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

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

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

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

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

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

</p>
<p>
USE master<br />
GO 
</p>
<p>
CREATE PROCEDURE sp_FindStringInTable @stringToFind VARCHAR(100), @SCHEMA sysname, @TABLE sysname<br />
AS 
</p>
<p>
DECLARE @sqlCommand VARCHAR(8000)<br />
DECLARE @WHERE VARCHAR(8000)<br />
DECLARE @columnName sysname<br />
DECLARE @CURSOR VARCHAR(8000) 
</p>
<p>
BEGIN TRY<br />
 SET @sqlCommand = &#39;SELECT * FROM &#39; + @SCHEMA + &#39;.&#39; + @TABLE + &#39; WHERE&#39;<br />
 SET @WHERE = &#39;&#39; 
</p>
<p>
 SET @CURSOR = &#39;DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME<br />
 FROM &#39; + DB_NAME() + &#39;.INFORMATION_SCHEMA.COLUMNS<br />
 WHERE TABLE_SCHEMA = &#39;&#39;&#39; + @SCHEMA + &#39;&#39;&#39;<br />
 AND TABLE_NAME = &#39;&#39;&#39; + @TABLE + &#39;&#39;&#39;<br />
 AND DATA_TYPE IN (&#39;&#39;char&#39;&#39;,&#39;&#39;nchar&#39;&#39;,&#39;&#39;ntext&#39;&#39;,&#39;&#39;nvarchar&#39;&#39;,&#39;&#39;text&#39;&#39;,&#39;&#39;varchar&#39;&#39;)&#39; 
</p>
<p>
 EXEC (@CURSOR) 
</p>
<p>
 OPEN col_cursor <br />
 FETCH NEXT FROM col_cursor INTO @columnName 
</p>
<p>
 WHILE @@FETCH_STATUS = 0 <br />
 BEGIN <br />
 IF @WHERE <> &#39;&#39;<br />
 SET @WHERE = @WHERE + &#39; OR&#39; 
</p>
<p>
 SET @WHERE = @WHERE + &#39; &#39; + @columnName + &#39; LIKE &#39;&#39;&#39; + @stringToFind + &#39;&#39;&#39;&#39;<br />
 FETCH NEXT FROM col_cursor INTO @columnName <br />
 END 
</p>
<p>
 CLOSE col_cursor <br />
 DEALLOCATE col_cursor 
</p>
<p>
 SET @sqlCommand = @sqlCommand + @where<br />
 --PRINT @sqlCommand<br />
 EXEC (@sqlCommand) <br />
END TRY<br />
BEGIN CATCH<br />
 PRINT &#39;There was an error&#39;<br />
 IF CURSOR_STATUS(&#39;variable&#39;, &#39;col_cursor&#39;) <> -3<br />
 BEGIN<br />
 CLOSE col_cursor <br />
 DEALLOCATE col_cursor <br />
 END<br />
END CATCH 
</p>
<p>

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

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

</p>
<p>
USE AdventureWorks<br />
GO <br />
EXEC sp_FindStringInTable &#39;%land%&#39;, &#39;Person&#39;, &#39;Contact&#39; 
</p>
<p>

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

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

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

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

طلال الحضبي.

المصدر: MSSQLTips.com

للمشاركة
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • PDF
  • Live
  • MySpace
  • RSS
  • Twitter
  • Yahoo! Bookmarks

الوسوم: ,

اترك رد