我的应用程序中有一个用户定义的函数,它以逗号分隔的列表作为参数。它拆分项目并将它们插入表变量并返回结果。
此功能运行良好,但当逗号分隔列表中的项目超过1000时,它会忽略余数。也就是说,如果我插入1239,将返回前1000行,其余239完全被忽略。发生这种情况时没有错误。
我不禁觉得这是由于某些我应该知道的限制,但我似乎无法找到任何有关它的信息。它是否可以存储在表变量中的行数限制?或者我在实际代码本身中遗漏了什么?有人可以帮忙吗?在这里悄悄地说。
ALTER FUNCTION [dbo].[ufnConvertArrayToIntTable] (@IntArray VARCHAR(8000))
RETURNS @retIntTable TABLE
(
ID int
)
AS
BEGIN
DECLARE @Delimiter char(1)
SET @Delimiter = ','
DECLARE @Item varchar(8)
IF CHARINDEX(@Delimiter,@IntArray,0) <> 0
BEGIN
WHILE CHARINDEX(@Delimiter,@IntArray,0) <> 0
BEGIN
SELECT
@Item = RTRIM(LTRIM(SUBSTRING(@IntArray,1,CHARINDEX(@Delimiter,@IntArray,0)-1))),
@IntArray = RTRIM(LTRIM(SUBSTRING(@IntArray,CHARINDEX(@Delimiter,@IntArray,0)+1,LEN(@IntArray))))
IF LEN(@Item) > 0
INSERT INTO @retIntTable SELECT @Item
END
IF LEN(@IntArray) > 0
INSERT INTO @retIntTable SELECT @IntArray
END
ELSE
BEGIN
IF LEN(@IntArray) > 0
INSERT INTO @retIntTable SELECT @IntArray
END
RETURN
END;
答案 0 :(得分:2)
您将输入变量定义为varchar(8000),并且@Item变量为varchar(8)。您的商品通常每个8个字符吗?您发送的字符串是否超过1000个字符超过8000个字符?请尝试将输入更改为varchar(max)。
答案 1 :(得分:1)
你的所有逗号分隔值都是8个字符长吗?如果是这样,那么输入参数将只能容纳888(8000/9(包括逗号)...
答案 2 :(得分:1)
这是因为您的输入参数限制为8000个字符。
您可以尝试使用子字符串调用该函数...也许:
WHERE
[myField] IN(Select ID from [dbo].[ufnConvertArrayToIntTable](substring(@inputarray, 1, 4000))
OR
[myField] IN(Select ID from [dbo].[ufnConvertArrayToIntTable](substring(@inputarray, 4001, 8000))
...