Một phương pháp bạn có thể muốn xem xét nếu bạn sẽ làm việc với các giá trị rất nhiều là trước tiên hãy viết chúng vào một bảng tạm thời. Sau đó, bạn chỉ cần tham gia vào nó như bình thường.
Bằng cách này, bạn chỉ phân tích cú pháp một lần.
Dễ dàng nhất để sử dụng một trong các UDF 'Tách', nhưng rất nhiều người đã đăng các ví dụ về những điều đó, tôi nghĩ rằng tôi sẽ đi một con đường khác;)
Ví dụ này sẽ tạo một bảng tạm thời để bạn tham gia (#tmpDept) và điền nó với id của bộ phận mà bạn đã truyền vào. Tôi giả sử bạn đang tách chúng bằng dấu phẩy, nhưng dĩ nhiên - bạn có thể thay đổi nó cho bất cứ điều gì bạn muốn.
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
Điều này sẽ cho phép bạn vượt qua trong một id bộ phận, nhiều id với dấu phẩy ở giữa chúng hoặc thậm chí nhiều id với dấu phẩy và khoảng trắng giữa chúng.
Vì vậy, nếu bạn đã làm một cái gì đó như:
SELECT Dept.Name
FROM Departments
JOIN #tmpDept ON Departments.DepartmentID=#tmpDept.DeptID
ORDER BY Dept.Name
Bạn sẽ thấy tên của tất cả các ID bộ phận mà bạn đã chuyển qua ...
Một lần nữa, điều này có thể được đơn giản hóa bằng cách sử dụng một hàm để điền vào bảng tạm thời ... Tôi chủ yếu làm điều đó mà không có ai chỉ để giết một chút nhàm chán :-P
- Kevin Fairchild