ASP.NET/SQL Server: сбой преобразования при преобразовании символьной строки в уникальный идентификатор

Я использую для этого парализованный запрос. Я передаю разделенную запятыми строку уникальных идентификаторов параметрам этого запроса, которые разделены. Он отлично работает, используя пару уникальных идентификаторов, но я думаю, что я достиг максимального значения около 2000 символов.

У меня есть около 150 areaID, и выбор нескольких запросов работает нормально. При выборе всех областей запрос завершается ошибкой и возвращается

Сбой преобразования при преобразовании строки символов в uniqueidentifier.

Любые предложения для получения большего значения в запросе, не сталкиваясь с этой проблемой?

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 ответ

Как уже упоминалось @DigitalID кажется, что вы должны использовать @List nvarchar(max)и я бы сказал, что в этом случае, независимо от характеристик производительности. Совершенно очевидно, что ваше приложение сейчас просто отправляет более 2000 символов, и кажется, что кодирование бомбы замедленного действия предполагает, что вы не будете отправлять более 4 тыс. Символов в какой-то момент в не слишком отдаленном будущем. Вы знаете, что приложение лучше, хотя.

Как правило, проблема производительности связана с хранением больших двоичных объектов, что обычно делает SQL Server только в том случае, если они превышают предел 8 КБ. Похоже, вы не храните эти данные, по крайней мере, в этой функции. Также может быть некоторое снижение производительности с точки зрения кэширования плана, но, опять же, если вам нужно максимальное количество, используйте его.

Другие вопросы по тегам