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

पैरामीटर की परिवर्तनीय संख्या के साथ संग्रहीत प्रक्रिया

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

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'INT')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, @Delimiter, '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );

अब आपकी संग्रहित प्रक्रिया:

CREATE PROCEDURE dbo.doStuff
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List, ',') AS list
        ON t.ID = list.Item;
END
GO

फिर इसे कॉल करने के लिए:

EXEC dbo.doStuff @List = '1, 2, 3, ...';

आप यहां कुछ पृष्ठभूमि, अन्य विकल्प और प्रदर्शन तुलना देख सकते हैं:

SQL सर्वर 2016 या इसके बाद के संस्करण पर, आपको STRING_SPLIT() और STRING_AGG() :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसएसआईएस में एक स्क्रिप्ट घटक को कैसे डिबग करें

  2. अनुक्रमित विचारों में MAX() कुल क्यों नहीं हो सकता है?

  3. दो दशमलव स्थानों के साथ एक संख्या लिखें SQL सर्वर

  4. लॉगिंग ओडीबीसी, एसक्यूएल सर्वर

  5. एसक्यूएल - एक्सएमएल बनाएं - यूनिकोड यूटीएफ -8 कैसे सेट करें