Jedną z metod, które warto rozważyć, jeśli zamierzasz dużo pracować z wartościami, jest zapisanie ich najpierw w tabeli tymczasowej. Następnie po prostu dołącz do tego jak zwykle.
W ten sposób parsujesz tylko raz.
Najłatwiej jest użyć jednego z UDF 'Split', ale tak wiele osób zamieściło ich przykłady, pomyślałem, że pójdę inną drogą;)
Ten przykład utworzy tymczasową tabelę, do której możesz dołączyć (#tmpDept) i wypełni ją identyfikatorami działów, które przekazałeś. Zakładam, że oddzielasz je przecinkami, ale możesz - oczywiście - zmienić to co chcesz.
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
Umożliwi to przekazanie jednego identyfikatora działu, wielu identyfikatorów z przecinkami między nimi, a nawet wielu identyfikatorów z przecinkami i spacjami między nimi.
Więc jeśli zrobiłeś coś takiego:
SELECT Dept.Name
FROM Departments
JOIN #tmpDept ON Departments.DepartmentID=#tmpDept.DeptID
ORDER BY Dept.Name
Zobaczysz nazwy wszystkich przekazanych identyfikatorów działów ...
Ponownie, można to uprościć, używając funkcji do zapełnienia tabeli tymczasowej ... Zrobiłem to głównie bez niej, aby zabić nudę :-P
- Kevin Fairchild