Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thủ tục được lưu trữ với số lượng tham số thay đổi

Bạn có thể chuyển nó vào dưới dạng danh sách được phân tách bằng dấu phẩy, sau đó sử dụng hàm tách và kết hợp với kết quả.

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'INT')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, @Delimiter, '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );

Bây giờ thủ tục được lưu trữ của bạn:

CREATE PROCEDURE dbo.doStuff
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List, ',') AS list
        ON t.ID = list.Item;
END
GO

Sau đó, gọi nó là:

EXEC dbo.doStuff @List = '1, 2, 3, ...';

Bạn có thể xem một số so sánh nền, các tùy chọn khác và hiệu suất tại đây:

Tuy nhiên, trên SQL Server 2016 trở lên, bạn nên xem STRING_SPLIT() STRING_AGG() :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách hiển thị đối chiếu máy chủ trong SQL Server (T-SQL)

  2. Truy vấn SQL cho trung bình cuộn trong 7 ngày trong SQL Server

  3. Một khóa ngoại linh hoạt

  4. Di chuyển cơ sở dữ liệu thành viên ASP.NET sang SQL Azure

  5. SQL Server 2008 - Thu hẹp Nhật ký Giao dịch - Có cách nào để tự động hóa không?