Это действительно странное поведение.У меня есть запрос SQL, который вызывает исключение NullReferenceException.Запрос:
SELECT
rtrim(h.fieldA) AS fieldA,
h.fieldB AS fieldB,
dbo.GeographyUnionAggregate(dbo.MakeValidGeographyFromGeometry(l.geom).STIntersection(dbo.MakeValidGeographyFromGeometry(h.geom))).STArea() AS Area
FROM dbo.tableL AS l
INNER JOIN dbo.tableH AS h
ON l.geom.STIntersects(h.geom) = 1
WHERE
l.myField = 568
GROUP BY h.fieldA, h.fieldB
ORDER BY h.fieldB, Area DESC
Это вызовет эту ошибку:
> Msg 6522, Level 16, State 1, Line 1
A .NET Framework error occurred during execution of user-defined routine or aggregate "GeographyUnionAggregate":
System.NullReferenceException: Object reference not set to an instance of an object.
System.NullReferenceException:
at SQLSpatialTools.GeographyCollectionAggregate.Merge(GeographyCollectionAggregate group)
Однако!Если мы добавим в условие WHERE дополнительное условие:
SELECT
rtrim(h.fieldA) AS fieldA,
h.fieldB AS fieldB,
dbo.GeographyUnionAggregate(dbo.MakeValidGeographyFromGeometry(l.geom).STIntersection(dbo.MakeValidGeographyFromGeometry(h.geom))).STArea() AS Area
FROM dbo.tableL AS l
INNER JOIN dbo.tableH AS h
ON l.geom.STIntersects(h.geom) = 1
WHERE
l.myField = 568
AND l.AnotherField = 22
GROUP BY h.fieldA, h.fieldB
ORDER BY h.fieldB, Area DESC
Это будет нормально работать.
Теперь это нечетный бит.Поскольку результаты l.myField = 568 - это две записи, а результаты l.AnotherField = 22 - это две одинаковые записи.Таким образом, он должен работать без второго параметра так же, как и с первым - в данных нет никакой разницы.Единственное, о чем я могу думать, это то, что, возможно, существует некоторая разница во времени, необходимом для извлечения данных в зависимости от индексов, но оба поля проиндексированы, и для извлечения данных абсолютно не требуется времени в обоих случаях.
У кого-нибудь есть идеи, что-нибудь проверить?Кроме того, это прекрасно работает на нашем сервере разработки, который в настоящее время использует те же данные и ту же функцию GeographyUnionAggregate.