以下函数将在 2012 年用作字符串拆分
CREATE FUNCTION [dbo].[fn_string_split](@str NVARCHAR(MAX),
@delimiter NVARCHAR(255))
RETURNS TABLE
AS
RETURN
WITH a
AS (SELECT CAST(0 AS BIGINT) AS idx1,
CHARINDEX(@delimiter, @str) idx2
UNION ALL
SELECT idx2 + 1,
CHARINDEX(@delimiter, @str, idx2 + 1)
FROM a
WHERE idx2 > 0)
SELECT SUBSTRING(@str, idx1, COALESCE(NULLIF(idx2, 0), LEN(@str) + 1) - idx1) AS value,
ROW_NUMBER() OVER(
ORDER BY idx1) RN
FROM a;
然后您可以通过交叉应用来使用它。
DECLARE @Invoices AS TABLE
(InvoiceNumber NVARCHAR(50),
ProductIDCSV NVARCHAR(MAX)
);
INSERT INTO @Invoices
VALUES
('123','Prod123,Prod456,Prod789'),
('456','Prod987,Prod654,Prod321');
SELECT I.*,
P.Value AS ProductID
FROM @Invoices I
CROSS APPLY dbo.fn_string_split(I.ProductIDCSV, ',') P;
这将为您提供发票编号和离散产品 ID 的列表,然后您可以执行所需的任何比较。这应该会让您走上正确的答案之路。
附带说明,如果您提供可剪切和粘贴的数据集,而不是图像,那么那些试图帮助您的人的生活会变得更轻松。如果您看到我设置了一个 tvp 和一个插入的第二个脚本,那是一种简单的方法。