ASP.NET / SQL Server:从字符串转换为uniqueidentifier时转换失败

时间:2012-12-11 17:19:43

标签: asp.net sql-server-2008 sqldatasource uniqueidentifier parameterized-query

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

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

  

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

有关在不遇到此问题的情况下获取更多值进入查询的建议吗?

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

1 个答案:

答案 0 :(得分:1)

正如@DigitalID所提到的,您似乎应该使用@List nvarchar(max),并且我会说在这种情况下这样做,无论性能特征如何。相当肯定的是,你的应用程序现在只发送超过2000个字符,而且似乎是时间炸弹编码,假设你不会在不太遥远的未来发送超过4k的数据。不过,你知道你应用最好。

通常,性能问题是由于BLOB的存储,SQL Server通常只在go above the 8kB limit时才会这样做。您似乎没有存储此数据,至少在此功能中。也可能有一些performance degradation in terms of plan caching,但如果你需要max,那么再次使用它。

相关问题