In 2005 en eerder kun je een array niet als parameter doorgeven aan een opgeslagen procedure, maar om deze functionaliteit te emuleren geef je in een door komma's gescheiden lijst met ID's een VARCHAR-parameter door. Je moet dan deze lijst ontleden door elke id toe te voegen aan een variabele tabel. Gebruik dan IN op het resultaat van de tabel. Dit is geen elegante oplossing, maar het is ongeveer het beste wat je kunt doen.
DECLARE @List TABLE (ID INT)
INSERT @List VALUES ('123')
INSERT @List VALUES ('12')
SELECT *
FROM
MyTable
WHERE
MyTableID IN (SELECT ID FROM @List)
Dit kan het beste worden bereikt door een functie te maken die een lijst met ID's als een tekenreeks opneemt en uw lijst met ID's als een tabel retourneert.
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
Hier is een voorbeeld van het maken van een opgeslagen procedure die een lijst met ID's inneemt met behulp van deze functie
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