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

SQL सर्वर SP - IN सरणी सूची के लिए पैरामीटर पास करें?

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

DECLARE @List TABLE (ID INT)

INSERT @List VALUES ('123')
INSERT @List VALUES ('12')

SELECT *
FROM
    MyTable
WHERE
    MyTableID IN (SELECT ID FROM @List)

यह एक फ़ंक्शन बनाकर सबसे अच्छा पूरा किया जाता है जो एक स्ट्रिंग के रूप में आईडी की सूची लेता है और एक तालिका के रूप में आपकी आईडी की सूची देता है।

IF EXISTS(
    SELECT *
    FROM sysobjects
    WHERE name = 'ParseIDArray')
BEGIN
    DROP FUNCTION ParseIDArray
END
GO

CREATE FUNCTION [dbo].[ParseIDArray] (@IDList VARCHAR(8000))
RETURNS
    @IDListTable TABLE (ID INT)
AS
BEGIN

    DECLARE
        [email protected] VARCHAR(100),
        @LastCommaPosition INT,
        @NextCommaPosition INT,
        @EndOfStringPosition INT,
        @StartOfStringPosition INT,
        @LengthOfString INT,
        @IDString VARCHAR(100),
        @IDValue INT

    --SET @IDList = '11,12,113'

    SET @LastCommaPosition = 0
    SET @NextCommaPosition = -1

    IF LTRIM(RTRIM(@IDList)) <> ''
    BEGIN

        WHILE(@NextCommaPosition <> 0)
        BEGIN

            SET @NextCommaPosition = CHARINDEX(',',@IDList,@LastCommaPosition + 1)

            IF @NextCommaPosition = 0
                SET @EndOfStringPosition = LEN(@IDList)
            ELSE
                SET @EndOfStringPosition = @NextCommaPosition - 1

            SET @StartOfStringPosition  = @LastCommaPosition + 1
            SET @LengthOfString = (@EndOfStringPosition + 1) - @StartOfStringPosition

            SET @IDString =  SUBSTRING(@IDList,@StartOfStringPosition,@LengthOfString)                  

            IF @IDString <> ''
                INSERT @IDListTable VALUES(@IDString)

            SET @LastCommaPosition = @NextCommaPosition

        END --WHILE(@NextCommaPosition <> 0)

    END --IF LTRIM(RTRIM(@IDList)) <> ''

    RETURN

ErrorBlock:

    RETURN

END --FUNCTION

यहां एक संग्रहीत कार्यविधि बनाने का एक उदाहरण दिया गया है जो इस फ़ंक्शन का उपयोग करके आईडी की सूची लेता है

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'TestArrayParameter')
BEGIN
    DROP PROCEDURE TestArrayParameter
END
GO



CREATE PROCEDURE TestArrayParameter
    @ArrayParameter VARCHAR(8000)
AS
BEGIN


    SELECT *
    FROM TestTable123
    WHERE TestTblID IN (SELECT ID FROM [dbo].[ParseIDArray](@ArrayParameter))

    -- OR BETTER

    SELECT *
    FROM
        TestTable123 test
        INNER JOIN [dbo].[ParseIDArray](@ArrayParameter) list
         ON list.ID = test.TestTblID

END
GO

CREATE TABLE TestTable123  (TestTblID INT, TestTblVal VARCHAR(50))

INSERT TestTable123 VALUES (3,'Three')
INSERT TestTable123 VALUES (25,'Twenty Five')
INSERT TestTable123 VALUES (100,'One Hundred')

DECLARE @IDList VARCHAR(8000)

SET @IDList = '25,100'

EXEC TestArrayParameter @IDList

DROP TABLE TestTable123



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PI () SQL सर्वर में उदाहरण

  2. नंबर टेबल बनाने और भरने का सबसे अच्छा तरीका क्या है?

  3. कुल कार्य के बिना TSQL धुरी

  4. एसक्यूएल क्वेरी दो तालिकाओं के बीच अंतर वापस करने के लिए

  5. मैं SQL सर्वर प्रबंधन स्टूडियो के साथ एक समग्र कुंजी कैसे बनाऊं?