我正在从大型数据集中搜索大量 ID 列表。 当我尝试使用 IN 搜索 ID 时,它说我已超出字符限制,因此无法运行。
如果我要将它们分成可管理的大小(见下文),由于大小,我会花费很长时间。
是否可以有一个包含我想要的所有ID列表的变量,并在where函数中使用IN VAR?
如果我要分成更小的块
(customer_id in ('1', '2', '3', ..., '1000')
or
customer_id in ('1001', '1002', '1003', ..., '2000')
or
customer_id in ('2001', '2002', '2003', ..., '3000'))
我想要什么(逐字)
Cust_ID_List IN ('1', '2', '3', ... '3000') -- 变量
从数据中选择* ID 在 Cust_ID_List 中的位置
创建一个函数:
CREATE FUNCTION [dbo].[sp_Split](@text nvarchar(max), @delimiter nvarchar(20) = ' ')
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index - len(@delimiter) +1))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index - len(@delimiter) +1))
END
RETURN
END
称呼它
SELECT *
FROM DATA d
INNER JOIN dbo.sp_Split('1,2,3,4,5,6,7,8,99,999,3000', ',') sp_Split ON
d.Cust_ID_List = sp_Split.[value]