Un metodo che potresti voler prendere in considerazione se lavorerai molto con i valori è quello di scriverli prima in una tabella temporanea. Quindi ti unisci ad esso come di consueto.
In questo modo, stai analizzando una sola volta.
È più facile usare uno degli UDF "Split", ma così tante persone ne hanno pubblicato esempi, ho pensato che avrei seguito una strada diversa;)
Questo esempio creerà una tabella temporanea per la tua partecipazione (#tmpDept) e la riempirà con l'id del dipartimento che hai passato. Suppongo che le stai separando con virgole, ma puoi - ovviamente - cambiare per quello che vuoi.
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
Ciò ti consentirà di passare un ID reparto, più ID con virgole tra di loro o anche più ID con virgole e spazi tra di loro.
Quindi se hai fatto qualcosa del genere:
SELECT Dept.Name
FROM Departments
JOIN #tmpDept ON Departments.DepartmentID=#tmpDept.DeptID
ORDER BY Dept.Name
Vedresti i nomi di tutti gli ID dipartimento che hai passato ...
Ancora una volta, questo può essere semplificato usando una funzione per popolare la tabella temporanea ... L'ho fatto principalmente senza uno solo per uccidere un po 'di noia :-P
- Kevin Fairchild