1

我为此使用了参数化查询。我传递一个逗号分隔的唯一标识符字符串到这个查询的参数被拆分。它使用一对唯一的标识符可以正常工作,但我认为我的最大值达到了2000个字符。ASP.NET/SQL Server:从字符串转换为uniqueidentifier时转换失败

我有大约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 
+1

“@ AreaIDs”的数据类型和'dbo.Split'中定义的参数是什么?如果其中任何一个都是'[n] varchar(2000)',那么就有你的答案。 [你可以看看TVPs。](http://www.sommarskog.se/arrays-in-sql-2008.html) –

+0

你能分享你的Split功能的来源吗?这不是ms sql server的内置函数。 –

+0

我正在使用一个asp.net控制参数来传递唯一标识的逗号dilemmeted字符串。 user1751121

回答

1

正如@DigitalID提到好像你应该使用@List nvarchar(max),我会说在这种情况下,这样做无论性能特征。可以肯定的是,您的应用程序现在仅发送超过2000个字符,而且似乎是时间炸弹编码,假设您在不久的将来不会发送超过4k的字符。不过,你最了解你的应用程序。

一般来说,性能问题是由于BLOB存储的问题,SQL Server通常只能在go above the 8kB limit的情况下执行。至少在这个函数中,你似乎没有存储这些数据。也可能有一些performance degradation in terms of plan caching,但同样,如果你需要max,那就使用它。

+0

我也认为马丁史密斯提出的传递这个参数的另一种方法值得一看(TVPs)。 –

相关问题