where
句で特定の条件を無効または有効にすると、選択クエリが.NET Frameworkエラーをスローするという奇妙な問題に直面しています。SQLクエリでwhere句を有効にすると.NET Frameworkエラーが発生する
ここにはCREATE
テーブルスクリプトがあります。
表test_classes:
CREATE TABLE [dbo].[test_classes]
(
[CLASSID] [int] NOT NULL,
[PARENTID] [int] NULL,
[CATID] [int] NOT NULL,
[CLASS_NAME] [nvarchar](255) NOT NULL,
[ORIGINAL_NAME] [nvarchar](255) NULL,
[GEOMETRY] [tinyint] NOT NULL,
[READ_ONLY] [bit] NOT NULL,
[DISPLAY_STYLES] [image] NULL,
[FEATURE_COUNT] [int] NOT NULL,
[TEMPOWNER] [int] NULL,
[OPTIONS] [int] NOT NULL,
[POLYGON_TYPE] [int] NULL,
[CLASS_EXTRA] [nvarchar](1024) NULL,
[MAPID] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
表test_polygon:
CREATE TABLE [dbo].[test_polygon]
(
[FID] [nvarchar](36) NOT NULL,
[EXTENT_L] [float] NOT NULL,
[EXTENT_T] [float] NOT NULL,
[EXTENT_R] [float] NOT NULL,
[EXTENT_B] [float] NOT NULL,
[COORDINATES] [image] NULL,
[CHAINS] [smallint] NOT NULL,
[CLASSID] [int] NOT NULL,
[SPATIAL_KEY] [bigint] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
により(による画像データ型に)ワード制限は、ここでINSERT
入力される:GDrive SQL Link
SELECT
SQLクエリ:
select
Class_Name, FID,
geometry::STGeomFromWKB(b1+b2,0) as polygon,
Class_ID, Original_Name
from
(Select
cl.Class_Name, p.FID,
substring(CAST(p.Coordinates AS varbinary(max)),1,1) as b1,
substring(CAST(p.Coordinates AS varbinary(max)),3,999999) as b2,
cl.ClassID as Class_ID,
cl.Original_Name
From
test_polygon p
Inner Join
test_classes cl on cl.ClassID = p.ClassID) s_polygon
--where Class_ID = 215 --Filter#1
--where Class_Name = 'L1_County' --Filter#2
注意すると、Class_ID 215は 'L1_County' class_nameを表します。
問題は、フィルタ#1を有効にすると、出力が期待どおりであることです。しかし、フィルタ#2だけを有効にすると、クエリは.NET Error
で失敗します。
予想される出力:私が得る
Class_Name FID polygon Class_ID Original_Name
----------- ---------------- ------------- ----------- ------------------------
L1_County Northamptonshire <long value> 215 B8USR_4DB8184E88092424
エラー:
6522、レベル16、状態1、行4
A .NET Frameworkのエラーは、ユーザー定義ルーチンの実行中に発生しました
System.FormatException:24119:外部リングの開始点と終了点が同じではないため、ポリゴン入力が無効です。ポリゴンの各リングは、同じ開始点と終了点を持つ必要があります。にSystem.FormatException:Microsoft.SqlServer.Types.Validatorで
Microsoft.SqlServer.Types.GeometryValidator.ValidatePolygonRingで (のInt32 iRing、のInt32 cPoints、ダブルfirstX、ダブルfirstY、ダブルlastX、ダブルlastY)
。実行(遷移遷移)Microsoft.SqlServer.Types.ForwardingGeoDataSink.EndFigure()で
Microsoft.SqlServer.Types.WellKnownBinaryReader.ReadLineStringPoints(BYTEORDER BYTEORDER、UInt32型cPoints、ブールREADZ、ブールreadM)
Microsoft.SqlServer ATで
.Types.WellKnownBinaryReader.ReadLinearRing(ByteOrder byteOrder、Boolean readZ、Boolean readM)Microsoft.SqlServer.Types.WellKnownBinaryReader.ReadでMicrosoft.SqlServer.Types.WellKnownBinaryReader.ParseWkbPolygonWithoutHeader(BYTEORDER BYTEORDER、ブールREADZ、ブールreadM)Microsoft.SqlServer.Types.WellKnownBinaryReader.ParseWkbで
(OpenGisType>型)>で (OpenGisType型、Int32 srid)
、Microsoft.SqlServer.Types.SqlGeometry.GeometryFromBinary(OpenGisType型、SqlBytesバイナリ、Int32 srid)
WHERE
句にClass_Nameがあり、Class_IDでないときにエラーが発生するのはなぜですか。
私はSQL Server 2012 Enterprise Editionを使用しています。エラーはSQL Server 2008でも複製されます。
編集:
フィルタ#2の推定実行計画:フィルタ#1のための
推定実行計画
これは可能性があるため、異なる実行計画へ。 IDフィルタは索引を使用する可能性が高いため、索引に基づいて1つの行のみが戻されます。名前フィルタは表スキャンを使用していて、多くの行(「dodgy行」を含む)を戻してからジオメトリを計算し、 – Alex
ちょうどそれを詳しく説明するにはおそらくこの質問に似ています:https://stackoverflow.com/questions/17427560/conversion-failed-when-converting-the-varchar-value-n-to-data-type-int。フィルタなしでクエリを実行するとエラーが発生しますか? – Alex
コメントありがとう@Alex。はい、フィルタなしで実行するとエラーが発生します。それは当然です。 1つの特定のポリゴンに対してWKBが失敗します。私の質問は、なぜフィルタ#2は、フィルタ#1のようなレコードをフィルタリングしていないということでした。 –