bgu*_*ler 4 sql-server t-sql sql-server-2012
这个问题的背景可以在这里找到。
我的存储过程的以下部分不起作用。条款是否有字符长度限制LIKE?t1.ProductList有时最长可达 1000 个字符:
DELETE t1 FROM #tmptable t1
WHERE EXISTS (SELECT 1 FROM #tmptable2_ t2
WHERE t1.DealerId != t2.DealerId
AND t2.ProductList LIKE '%' + t1.ProductList + '%'
AND t2.numberOfVibs > t1.numberOfVibs);
Run Code Online (Sandbox Code Playgroud)
列中单行的示例数据ProductList:
B1ZMA25706,B1ZMI09502,B1ZMI12910,B1ZMI18602,BB001TBL26,BBHMOVE4,BE09501FBL,BGS52200,BKS3003,BM2,BO11001EBO,BPGTB1200,BPGTC172HP,BPGTX663,BPIVMS6502,BPIVOD1022,BPVA475,BPVB1000,BPVB800,BPVC652,BPVPW1500,BPVW1000,BPVX652,BPVX662,BREMEN78, BSA2602、BSD2880、BSG62082、BSG71800、BSG81623、BSG82422、BSG82480、BSGL32015、CAB150、CAB21、CD1401B、CD21001WAL、CD210012004CD500、CD21001、CD5000、CD2100400400000000000000000000000C
LIKE 子句是否有任何字符长度限制?
是的。从文档中LIKE:
图案
是要在 match_expression 中搜索的特定字符串,可以包含以下有效通配符。模式最多可以是8,000 字节。
在您的情况下,限制为4,000 个字符,因为该FOR XML PATH表达式返回一个Unicode字符串(每个字符两个字节)。如果您检查ProductList临时表的列,您将看到数据类型为nvarchar(max):
EXECUTE tempdb.sys.sp_help
@objname = N'#tmptable';
Run Code Online (Sandbox Code Playgroud)

根据您的数据,您可以改用单字节ANSI字符,为 的连接字符串提供最多7,998 个字符ProductCodes:
CREATE TABLE #SellerProducts
(
SellerID integer PRIMARY KEY,
ProductList varchar(7998) NOT NULL,
ProductCount bigint NOT NULL
);
INSERT #SellerProducts
(
SellerID,
ProductList,
ProductCount
)
SELECT
s.SellerId,
STUFF
(
(
SELECT
',' + ProductCode
FROM Stocks
WHERE
s.SellerId = Stocks.SellerId
ORDER BY
ProductCode
FOR XML
PATH('')
)
, 1, 1, ''
),
COUNT_BIG(*)
FROM dbo.Stocks AS s
WHERE
s.ProductCode IN ('30A','20A','42B')
AND s.StockData > 0
GROUP BY
s.SellerId;
Run Code Online (Sandbox Code Playgroud)
上面的代码故意设计为如果ProductList包含超过 7,998 个字符会抛出以下错误:

你不是需要创建临时表做的第二个副本DELETE:
DELETE t1
FROM #SellerProducts AS t1
WHERE EXISTS
(
SELECT 1
FROM #SellerProducts AS t2
WHERE
t2.SellerId <> t1.SellerId
AND t2.ProductList LIKE '%' + t1.ProductList + '%'
AND t2.ProductCount > t1.ProductCount
);
Run Code Online (Sandbox Code Playgroud)
该ProductList列的字符限制为7,998 个字符,以允许%在LIKE执行之前添加两个字符- 总共 8,000 个字符,这是LIKE 模式字符串所允许的最大值。