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 КБ. Похоже, вы не храните эти данные, по крайней мере, в этой функции. Также может быть некоторое снижение производительности с точки зрения кэширования плана, но, опять же, если вам нужно максимальное количество, используйте его.