Один метод, который вы можете рассмотреть, если вы собираетесь много работать со значениями, - это сначала записать их во временную таблицу. Тогда вы просто присоединитесь к нему, как обычно.
Таким образом, вы анализируете только один раз.
Проще всего использовать один из UDF-файлов «Split», но так много людей опубликовали примеры, и я подумал, что пойду другим путем;)
В этом примере будет создана временная таблица для присоединения к ней (#tmpDept) и заполнение ее идентификаторами отделов, которые вы передали. Я предполагаю, что вы разделяете их запятыми, но вы можете - конечно - изменить это все, что вы хотите.
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
Это позволит вам передавать один идентификатор отдела, несколько идентификаторов с запятыми между ними или даже несколько идентификаторов с запятыми и пробелами между ними.
Так что, если вы сделали что-то вроде:
SELECT Dept.Name
FROM Departments
JOIN #tmpDept ON Departments.DepartmentID=#tmpDept.DeptID
ORDER BY Dept.Name
Вы увидите имена всех идентификаторов отделов, которые вы передали ...
Опять же, это можно упростить, используя функцию для заполнения временной таблицы ... В основном я делал это без единой цели, чтобы просто убить скуку :-P
- Кевин Фэйрчайлд