Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

दी गई तालिका के लिए गतिशील रूप से कॉलम खोजें

  1. आपको केवल उन स्तंभों को खोजने की आवश्यकता है जिनमें वास्तव में तार हों, न कि किसी तालिका के सभी स्तंभ (जिसमें पूर्णांक, दिनांक, GUID, आदि शामिल हो सकते हैं)।
  2. आपको #temp तालिका (और निश्चित रूप से ##temp तालिका नहीं) की बिल्कुल भी आवश्यकता नहीं होनी चाहिए।
  3. आपको गतिशील SQL का उपयोग करने की आवश्यकता है (हालांकि मुझे यकीन नहीं है कि यह अब तक आपके पाठ्यक्रम का हिस्सा रहा है)।
  4. मुझे कुछ का पालन करना फायदेमंद लगता है सरल सम्मेलन , जिसका आपने उल्लंघन किया है:
    • 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 को अनकम्मेंट करें ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अधिकतम लंबाई और अधिकतम लंबाई वाले सभी SQL स्तंभों की सूची बनाएं

  2. सर्वर में सभी डेटाबेस के लिए संदर्भ संग्रहीत कार्यविधियाँ

  3. गतिशील रूप से चुनिंदा क्वेरी में एक विशेषता नाम कैसे लिखें

  4. मैं उनकी विदेशी कुंजी के आधार पर दो या दो से अधिक पंक्तियों को कैसे मर्ज करूं?

  5. SQL पुनरावर्ती मेनू छँटाई