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

Truyền một biến vào mệnh đề IN trong một hàm SQL?

Đây là một cách hiệu quả hơn một chút để chia danh sách các số nguyên. Đầu tiên, hãy tạo một bảng số, nếu bạn chưa có. Thao tác này sẽ tạo một bảng với 100.000 số nguyên duy nhất (bạn có thể cần nhiều hơn hoặc ít hơn):

;WITH x AS
(
   SELECT TOP (1000000) Number = ROW_NUMBER() OVER 
   (ORDER BY s1.[object_id])
   FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
   ORDER BY s1.[object_id]
)
SELECT Number INTO dbo.Numbers FROM x;

CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers(Number);

Sau đó, một hàm:

CREATE FUNCTION [dbo].[SplitInts_Numbers]
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
   RETURN
   (
       SELECT Item = CONVERT(INT, SUBSTRING(@List, Number,
         CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number))
       FROM dbo.Numbers
       WHERE Number <= CONVERT(INT, LEN(@List))
         AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter
   );

Bạn có thể so sánh hiệu suất với cách tiếp cận lặp lại tại đây:

http://sqlfiddle.com/#!3/960d2/1

Để tránh bảng số, bạn cũng có thể thử phiên bản dựa trên XML của hàm - nó nhỏ gọn hơn nhưng kém hiệu quả hơn:

CREATE FUNCTION [dbo].[SplitInts_XML]
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
WITH SCHEMABINDING
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
   );

Dù sao khi bạn có một hàm, bạn có thể chỉ cần nói:

WHERE ID IN (SELECT Item FROM dbo.SplitInts_Numbers(@MyList, ','));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khóa chính tổng hợp so với cột ID bổ sung?

  2. Làm thế nào để chuyển đổi datetime sang tiếng Ba Tư trong SQL Server

  3. Chuỗi định dạng trong SQL Server là gì?

  4. Phải khai báo biến vô hướng @Id?

  5. SQL Server 2017:Nhập dữ liệu CSV từ Linux sang Salesforce bằng SSIS