1

我正在为此使用参数化查询。我将一个逗号分隔的唯一标识符字符串传递给该查询的拆分参数。使用几个唯一标识符可以正常工作,但我认为我达到了大约 2000 个字符的最大值。

我有大约 150 个 areaID,选择一些查询可以正常工作。选择查询失败并返回的所有区域

从字符串转换为唯一标识符时转换失败。

有什么建议可以让更多的值进入查询而不遇到这个问题?

Area.AreaID IN (SELECT CONVERT(UNIQUEIDENTIFIER, Value) FROM dbo.Split(@AreaIDs,','))

/

USE [Triton2]
GO
/****** Object:  UserDefinedFunction [dbo].[Split]    Script Date: 12/11/2012 11:39:39         AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Split]
(
    @List nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(

    Id int identity(1,1),
    Value uniqueidentifier
) 
AS  
BEGIN 
    While (Charindex(@SplitOn,@List)>0)
    Begin

        Insert Into @RtnValue (value)
        Select 
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))

        Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End

    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
END
4

1 回答 1

1

正如@DigitalID 所提到的,您似乎应该使用@List nvarchar(max),并且我会说在这种情况下这样做,而不管性能特征如何。可以肯定的是,您的应用程序现在只是发送了 2000 多个字符,并且假设您在不久的将来某个时候发送的字符数不会超过 4k,这似乎是定时炸弹编码。不过,您最了解自己的应用程序。

通常,性能问题是因为 BLOB 的存储,SQL Server 通常只有在它们超过 8kB 限制时才会这样做。您似乎没有存储这些数据,至少在这个函数中。在计划缓存方面也可能会出现一些性能下降,但同样,如果您需要 max,请使用它。

于 2012-12-11T18:34:28.323 回答