Um método que você pode considerar se estiver trabalhando muito com os valores é gravá-los em uma tabela temporária primeiro. Então você se junta a ele normalmente.
Dessa forma, você está analisando apenas uma vez.
É mais fácil usar uma das UDFs 'Divididas', mas muitas pessoas postaram exemplos delas; achei que eu iria por um caminho diferente;)
Este exemplo criará uma tabela temporária para você participar (#tmpDept) e a preencherá com os IDs de departamento que você inseriu. Suponho que você os esteja separando por vírgulas, mas é possível - é claro - alterar para o que você quiser.
IF OBJECT_ID('tempdb..#tmpDept', 'U') IS NOT NULL
BEGIN
DROP TABLE #tmpDept
END
SET @DepartmentIDs=REPLACE(@DepartmentIDs,' ','')
CREATE TABLE #tmpDept (DeptID INT)
DECLARE @DeptID INT
IF IsNumeric(@DepartmentIDs)=1
BEGIN
SET @DeptID=@DepartmentIDs
INSERT INTO #tmpDept (DeptID) SELECT @DeptID
END
ELSE
BEGIN
WHILE CHARINDEX(',',@DepartmentIDs)>0
BEGIN
SET @DeptID=LEFT(@DepartmentIDs,CHARINDEX(',',@DepartmentIDs)-1)
SET @DepartmentIDs=RIGHT(@DepartmentIDs,LEN(@DepartmentIDs)-CHARINDEX(',',@DepartmentIDs))
INSERT INTO #tmpDept (DeptID) SELECT @DeptID
END
END
Isso permitirá que você passe um ID de departamento, vários IDs com vírgulas entre eles ou mesmo vários IDs com vírgulas e espaços entre eles.
Então, se você fez algo como:
SELECT Dept.Name
FROM Departments
JOIN #tmpDept ON Departments.DepartmentID=#tmpDept.DeptID
ORDER BY Dept.Name
Você veria os nomes de todos os IDs de departamento pelos quais passou ...
Novamente, isso pode ser simplificado usando uma função para preencher a tabela temporária ... Eu fiz principalmente sem uma só para matar o tédio :-P
- Kevin Fairchild