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)。 –

相關問題