SQL Server SP – Passar parâmetro para lista de matriz “IN”?

Existe uma maneira de passar a matriz de valores para a seção IN de um SP como um único parâmetro para o SQL Server 2005?

Ex: Selecione * de MyTable onde ID IN (@MyValueArray)

Em 2005 e antes, você não pode transmitir uma matriz como um parâmetro para um procedimento armazenado, mas simular essa funcionalidade em uma lista separada por vírgulas de IDs como um parâmetro VARCHAR. Você precisará então analisar essa lista adicionando cada id a uma tabela de variables. Em seguida, use IN no resultado da tabela. Esta não é uma solução elegante, mas é o melhor que você pode fazer.

DECLARE @List TABLE (ID INT) INSERT @List VALUES ('123') INSERT @List VALUES ('12') SELECT * FROM MyTable WHERE MyTableID IN (SELECT ID FROM @List) 

Isso é melhor realizado criando uma function que recebe uma lista de ids como uma string e retorna sua lista de IDs como uma tabela.

 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 --@IDList 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 

Aqui está um exemplo de criação de um procedimento armazenado que leva em uma lista de IDs usando esta 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