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

एसक्यूएल सर्वर 2008:अल्पविराम सीमित सूची इनपुट करें?

मुझे पता है कि यह वास्तविक प्रश्न का उत्तर नहीं देता है, लेकिन मैंने इसे संभालने के लिए जो भी समाधान देखे हैं, वे एक प्रक्रिया में एकाधिक मानों को पारित करने में सक्षम नहीं होने की पिछली सीमाओं को प्राप्त करने के लिए एक गंदे हैक की तरह महसूस करते हैं। एसक्यूएल-सर्वर 2008 में तालिका मूल्यवान पैरामीटर की शुरूआत के बाद से मुझे कोई कारण नहीं दिख रहा है कि एसक्यूएल के भीतर एक सीमित स्ट्रिंग की आवश्यकता क्यों होगी:

मान रखने के लिए अपना प्रकार बनाना पहला कदम है (मैं सामान्य नामों का उपयोग करता हूं ताकि उनका पुन:उपयोग किया जा सके):

CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX));

फिर अपनी प्रक्रिया बनाएं:

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.StringList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   Org + '-' + OrgSub IN (SELECT Value FROM @OrgList);

GO

फिर आप अपनी प्रक्रिया को इस प्रकार कॉल कर सकते हैं

DECLARE @OrgList dbo.StringList;
INSERT @OrgList VALUES 
    ('2342342', '________', 'A'),
    ('5435354', '________', 'B');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

यह अधिक उपयुक्त तालिका बनाने की संभावना को भी वहन करेगा:

CREATE TYPE dbo.OrgList AS TABLE(Org VARCHAR(10), OrgSub VARCHAR(10));

CREATE PROCEDURE dbo.GetFromTable @OrgList dbo.OrgList READONLY
AS
    SELECT  Something
    FROM    MyTable
    WHERE   EXISTS
            (   SELECT  1
                FROM    @OrgList O
                WHERE   MyTable.Org = o.Org
                AND     MyTable.OrgSub = o.OrgSub
            );

GO

फिर निष्पादित करने के लिए

DECLARE @OrgList dbo.OrgList;
INSERT @OrgList VALUES 
    ('2342342', '________'),
    ('5435354', '________');

EXECUTE dbo.GetFromTable @OrgList;

SQL Fiddle

यदि अल्पविराम सीमांकित सूची को पारित करने के लिए बिल्कुल आवश्यक है, तो आप इसे एक्सएमएल रूपांतरण का उपयोग करके स्ट्रिंगलिस्ट प्रकार में परिवर्तित कर सकते हैं, और उसी प्रक्रिया का उपयोग कर सकते हैं, लेकिन तालिका मूल्यवान पैरामीटर का उपयोग करने से सीमांकित स्ट्रिंग का उपयोग करने से कहीं अधिक लचीलेपन की अनुमति मिलती है:

DECLARE @S VARCHAR(MAX) = '2342342-________,5435354-________,_______-________';

DECLARE @OrgList dbo.StringList;
INSERT @OrgList
SELECT  Y.value('.', 'NVARCHAR(MAX)')
FROM    (SELECT [X] = CAST(('<X>' + REPLACE(@S, ',' ,'</X><X>')+'</X>') AS XML)) X
        CROSS APPLY X.nodes('X') AS y (Y)

EXECUTE GetFromTable @OrgList

SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CTE का उपयोग करके SQL सर्वर क्वेरी आउटपुट के लिए अनुपलब्ध तिथियां भरें

  2. SQL सर्वर LIKE जिसमें ब्रैकेट वर्ण हैं

  3. क्या टाइमस्टैम्प कॉलम अद्वितीय है?

  4. SQL सर्वर (T-SQL) में एकल फ़ाइल समूह में एकाधिक विभाजन कैसे मैप करें

  5. SQLServer टाइमआउट अपवादों को कैसे पकड़ें