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