Une méthode que vous voudrez peut-être envisager si vous allez beaucoup travailler avec les valeurs consiste à les écrire d'abord dans une table temporaire. Ensuite, vous rejoignez simplement comme d'habitude.
De cette façon, vous ne analysez qu'une seule fois.
Il est plus facile d'utiliser l'un des UDF `` fractionnés '', mais tellement de gens en ont publié des exemples, j'ai pensé que je choisirais une voie différente;)
Cet exemple créera une table temporaire que vous pourrez rejoindre (#tmpDept) et la remplira avec les identifiants de service que vous avez transmis. Je suppose que vous les séparez par des virgules, mais vous pouvez - bien sûr - changer à ce que vous voulez.
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
Cela vous permettra de passer un identifiant de service, plusieurs identifiants avec des virgules entre eux, ou même plusieurs identifiants avec des virgules et des espaces entre eux.
Donc, si vous avez fait quelque chose comme:
SELECT Dept.Name
FROM Departments
JOIN #tmpDept ON Departments.DepartmentID=#tmpDept.DeptID
ORDER BY Dept.Name
Vous verriez les noms de tous les ID de service que vous avez transmis ...
Encore une fois, cela peut être simplifié en utilisant une fonction pour peupler la table temporaire ... Je l'ai principalement fait sans une juste pour tuer l'ennui :-P
- Kevin Fairchild