gpt4 book ai didi

sql - LIKE 语句中的 4000 个字符限制

转载 作者:行者123 更新时间:2023-12-01 23:10:39 46 4
gpt4 key购买 nike

我在 SSRS 报告调用的以前工作的存储过程中遇到错误,我已将其追溯到存储过程调用的标量函数中的 LIKE 语句,并结合了 7000+ NVARCHAR(MAX) 字符串.它类似于:

Msg 8152, Level 16, State 10, Line 14String or binary data would be truncated.

I can reproduce it with the following code:

DECLARE @name1 NVARCHAR(MAX) = ''
DECLARE @name2 NVARCHAR(MAX) = ''
DECLARE @count INT = 4001
WHILE @count > 0
BEGIN
SET @name1 = @name1 + 'a'
SET @name2 = @name2 + 'a'
SET @count = @count - 1
END

SELECT LEN(@name1)

IF @name1 LIKE @name2
PRINT 'OK'

这是怎么回事?无论如何围绕这个限制,还是有充分的理由?谢谢。

最佳答案

您也可以在没有可怕循环的情况下重现它:

DECLARE @name1 NVARCHAR(MAX), @name2 NVARCHAR(MAX);

SET @name1 = REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 4000);
SET @name2 = @name1;

IF @name1 LIKE @name2
PRINT 'OK';

SELECT @name1 += N'a', @name2 += N'a';

IF @name1 LIKE @name2
PRINT 'OK';

结果:

OK
Msg 8152, Level 16, State 10, Line 30
String or binary data would be truncated.



无论如何,原因是 clearly stated in the documentation for LIKE (强调我的):

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

...

pattern

Is the specific string of characters to search for in match_expression, and can include the following valid wildcard characters. pattern can be a maximum of 8,000 bytes.



8,000 个字节被 4,000 个 Unicode 字符用完。

我建议比较前 4,000 个字符可能就足够了:
WHERE column LIKE LEFT(@param, 4000) + '%';

我无法想象你想要比较整个事情的任何场景;有多少字符串包含相同的前 4000 个字符,但字符 4001 不同?如果这确实是一个要求,我想您可以在 the Connect item David pointed out 中确定的很长篇幅。 .

一个更简单(虽然计算成本可能更高)的解决方法可能是:
IF CONVERT(VARBINARY(MAX), @name1) = CONVERT(VARBINARY(MAX), @name2)
PRINT 'OK';

我建议通过比较大字符串来修复设计并停止识别行会好得多。真的没有其他方法可以识别您所追求的行吗?这就像通过测试所有杯架中所有 Dunkin Donuts 杯子的 DNA 来在 parking 场找到您的汽车,而不仅仅是检查车牌。

关于sql - LIKE 语句中的 4000 个字符限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751037/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com