1

これにはパラメータ化されたクエリを使用しています。分割されたこのクエリのパラメーターに、一意の識別子のコンマ区切りの文字列を渡しています。いくつかの一意の識別子を使用すると正常に機能しますが、最大値は約 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
4

1 に答える 1

1

@DigitalID で述べたように@List nvarchar(max)、を使用する必要があるようです。この場合は、パフォーマンスの特性に関係なく使用することをお勧めします。あなたのアプリケーションが現在 2000 文字以上を送信していることはほぼ確実であり、それほど遠くない将来のある時点で 4k 以上を送信することはないと仮定するのは時限爆弾のコーディングのように思われます。ただし、アプリを最もよく知っているのはあなたです。

一般に、パフォーマンスの問題は BLOB のストレージが原因であり、SQL Server は通常8kB の制限を超えた場合にのみ実行します。少なくともこの関数では、このデータを保存していないようです。プランのキャッシュに関してもパフォーマンスが低下する可能性がありますが、最大値が必要な場合はそれを使用してください。

于 2012-12-11T18:34:28.323 に答える