• An alternative, without the STCrosses function, filtering using STIntersects.

    😎

    DECLARE @GEOLINE TABLE

    (

    GEOLINE_ID INT IDENTITY(1,1) NOT NULL

    ,GEOLINE_LINE GEOMETRY NOT NULL

    );

    INSERT INTO @GEOLINE (GEOLINE_LINE)

    VALUES

    (geometry::STGeomFromText('LINESTRING(0 1, 6 0)', 0))

    ,(geometry::STGeomFromText('LINESTRING(0 2, 5 0)', 0))

    ,(geometry::STGeomFromText('LINESTRING(0 3, 4 0)', 0))

    ,(geometry::STGeomFromText('LINESTRING(0 4, 3 0)', 0))

    ,(geometry::STGeomFromText('LINESTRING(0 5, 2 0)', 0))

    ,(geometry::STGeomFromText('LINESTRING(0 6, 1 0)', 0));

    SELECT

    G1.GEOLINE_ID AS START_LINE

    ,G2.GEOLINE_ID AS COMP_LINE

    ,G1.GEOLINE_LINE.STIntersection(G2.GEOLINE_LINE).STBuffer(0.1) AS LINE_INTERSECTION

    FROM @GEOLINE G1

    CROSS APPLY @GEOLINE G2

    WHERE G1.GEOLINE_ID > G2.GEOLINE_ID

    AND G1.GEOLINE_LINE.STIntersects(G2.GEOLINE_LINE) = 1

    UNION ALL

    SELECT

    G1.GEOLINE_ID

    ,0

    ,G1.GEOLINE_LINE AS LINE_INTERSECTION

    FROM @GEOLINE G1;