- आपको केवल उन स्तंभों को खोजने की आवश्यकता है जिनमें वास्तव में तार हों, न कि किसी तालिका के सभी स्तंभ (जिसमें पूर्णांक, दिनांक, GUID, आदि शामिल हो सकते हैं)।
- आपको #temp तालिका (और निश्चित रूप से ##temp तालिका नहीं) की बिल्कुल भी आवश्यकता नहीं होनी चाहिए।
- आपको गतिशील SQL का उपयोग करने की आवश्यकता है (हालांकि मुझे यकीन नहीं है कि यह अब तक आपके पाठ्यक्रम का हिस्सा रहा है)।
- मुझे कुछ का पालन करना फायदेमंद लगता है सरल सम्मेलन
, जिसका आपने उल्लंघन किया है:
PROCEDURE
का उपयोग करें नहींPROC
- यह "प्रोक" नहीं है, यह एक "संग्रहीत प्रक्रिया" है।dbo.
(या वैकल्पिक स्कीमा) किसी वस्तु का संदर्भ देते समय उपसर्ग ।- अपनी प्रक्रिया के मुख्य भाग को
BEGIN
. में लपेटें /END
। - स्वरों का उदारतापूर्वक प्रयोग करें। क्या आप
@tblname
. कहकर इतने सारे कीस्ट्रोक्स बचा रहे हैं, समय की परवाह नहीं करते@tablename
. के बजाय या@table_name
? मैं किसी विशिष्ट परंपरा के लिए नहीं लड़ रहा हूं, लेकिन पठनीयता की कीमत पर पात्रों को सहेजना 70 के दशक में अपना आकर्षण खो चुका है। sp_
का उपयोग न करें संग्रहीत कार्यविधियों के लिए उपसर्ग - इस उपसर्ग का SQL सर्वर में विशेष अर्थ है। यह क्या करता है इसके लिए प्रक्रिया का नाम दें। इसे उपसर्ग की आवश्यकता नहीं है, ठीक वैसे ही जैसे हम जानते हैं कि वेtbl
. के बिना भी टेबल हैं उपसर्ग। यदि आपको वास्तव में वहां एक उपसर्ग की आवश्यकता है, तोusp_
. जैसे किसी अन्य उपसर्ग का उपयोग करें याproc_
लेकिन मुझे व्यक्तिगत रूप से नहीं लगता कि उपसर्ग आपको ऐसी कोई जानकारी देता है जो आपके पास पहले से नहीं है।- चूंकि तालिकाओं को यूनिकोड का उपयोग करके संग्रहीत किया जाता है (और आपके कुछ कॉलम भी हो सकते हैं), आपके पैरामीटर
NVARCHAR
होने चाहिए , नहींVARCHAR
. और पहचानकर्ता 128 वर्णों पर छाया हुआ है, इसलिए@tablename
के लिए> 257 वर्णों का समर्थन करने का कोई कारण नहीं है । - सेमी-कोलन के साथ स्टेटमेंट खत्म करें ।
INFORMATION_SCHEMA
- हालांकि बाद वाला वही है जो आपके प्रोफेसर ने पढ़ाया होगा और उम्मीद कर सकते हैं।
CREATE PROCEDURE dbo.SearchTable
@tablename NVARCHAR(257),
@term NVARCHAR(4000)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM ' + @tablename + ' WHERE 1 = 0';
SELECT @sql = @sql + '
OR ' + c.name + ' LIKE ''%' + REPLACE(@term, '''', '''''') + '%'''
FROM
sys.all_columns AS c
INNER JOIN
sys.types AS t
ON c.system_type_id = t.system_type_id
AND c.user_type_id = t.user_type_id
WHERE
c.[object_id] = OBJECT_ID(@tablename)
AND t.name IN (N'sysname', N'char', N'nchar',
N'varchar', N'nvarchar', N'text', N'ntext');
PRINT @sql;
-- EXEC sp_executesql @sql;
END
GO
जब आप खुश होते हैं कि यह SELECT
. को आउटपुट कर रहा है आप जिस क्वेरी के बाद हैं, उस पर टिप्पणी करें PRINT
और EXEC
को अनकम्मेंट करें ।