SQL - странное поведение, выдача запроса NullReferenceException, если не используются посторонние параметры - PullRequest
0 голосов
/ 26 февраля 2019

Это действительно странное поведение.У меня есть запрос 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.

...