Há algumas maneiras de fazer isso. Você pode passar o parâmetro como um blob XML como este exemplo:
CREATE PROCEDURE [dbo].[uspGetCustomersXML]
@CustomerIDs XML
AS
BEGIN
SELECT c.ID, c.Name
FROM [dbo].[Customer] c
JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int' )
END
GO
--Example Use:
EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID>100</ID></IDList>'
Ou passe os valores como CSV e use uma função de divisão para dividir os valores em uma variável de tabela (há muitas funções de divisão por aí, a pesquisa rápida lançará uma).
CREATE PROCEDURE [dbo].[uspGetCustomersCSV]
@CustomerIDs VARCHAR(8000)
AS
BEGIN
SELECT c.Id, c.Name
FROM [dbo].[Customer] c
JOIN dbo.fnSplit(@CustomerIDs, ',') t ON c.Id = t.item
END
GO
--Example Use:
EXECUTE [dbo].[uspGetCustomersCSV] '1,10,100'
Se você estivesse usando o SQL 2008 ou posterior, poderia ter usado Parâmetros com valor de tabela que permitem passar uma variável TABLE como um parâmetro. Eu bloguei sobre essas 3 abordagens um tempo atrás, com uma rápida comparação de desempenho.