LIKE 字符长度限制

bgu*_*ler 4 sql-server t-sql sql-server-2012

这个问题的背景可以在这里找到

我的存储过程的以下部分不起作用。条款是否有字符长度限制LIKEt1.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

Pau*_*ite 8

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)

sp_help 输出

根据您的数据,您可以改用单字节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 模式字符串所允许的最大值。