我有一些数据可以批量导入到这个表结构中:
CREATE TABLE #Temp
(
WellKnownText NVARCHAR(MAX)
)
部分参赛作品无效。所以像这样:
SELECT geometry::STPolyFromText(WellKnownText,4326) FROM #Temp
不适用于所有行,因此会失败。
检测哪个WellKnownText无效的最佳方法是什么?我过去使用过MakeValid - 理想情况下我想尽可能地修复条目。
PS:
这不起作用:
SELECT * FROM #Temp
WHERE geometry::STPolyFromText(WellKnownText,4326).STIsValid() = 0
PPS:
我最终选择了基于循环的方法:
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp;
IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL DROP TABLE #Temp1;
DECLARE @LoopCounter INT = 1;
DECLARE @MaxCounter INT;
DECLARE @Valid BIT;
DECLARE @ValidCounter INT;
DECLARE @WellKnownText NVARCHAR(MAX);
CREATE TABLE #Temp
(
Guid UNIQUEIDENTIFIER,
PostcodeFraction NVARCHAR(50),
WellKnownText NVARCHAR(MAX),
GeoJson NVARCHAR(MAX)
);
CREATE TABLE #Temp1
(
Guid UNIQUEIDENTIFIER,
PostcodeFraction NVARCHAR(50),
WellKnownText NVARCHAR(MAX),
GeoJson NVARCHAR(MAX)
);
BULK INSERT #Temp FROM 'D:\PolygonData.txt' WITH (FIELDTERMINATOR = '\t', FIRSTROW = 2, ROWTERMINATOR = '\n');
ALTER TABLE #Temp ADD Id INT IDENTITY(1,1);
SELECT @MaxCounter = MAX(Id) FROM #Temp
SET @ValidCounter = 0;
WHILE(@LoopCounter <= @MaxCounter)
BEGIN
BEGIN TRY
SELECT @WellKnownText = WellKnownText FROM #Temp WHERE Id = @LoopCounter;
SET @Valid = GEOMETRY::STGeomFromText(@WellKnownText,4326).STIsValid();
SET @ValidCounter = @ValidCounter + 1;
END TRY
BEGIN CATCH
SET @Valid = 0;
END CATCH
IF(@Valid = 1)
BEGIN
INSERT INTO #TEMP1
SELECT Guid, PostcodeFraction, WellKnownText, GeoJson FROM #Temp WHERE Id = @LoopCounter;
END
SET @LoopCounter = @LoopCounter + 1;
END
PRINT @ValidCounter;
SELECT * FROM #TEMP1;
答案 0 :(得分:1)
根据评论中的要求,提供了一些可能的解决方案
我猜你真的在寻找一个可以CROSS APPLY
编辑的功能,比如
SELECT * FROM #Temp T
CROSS APPLY IsWKTValidFunc(T.WellKnownText, 4326) F
WHERE F.IsValid = <somecondition>
(或者甚至添加到计算列中,为您提供插入WKT时设置的标记)
https://gis.stackexchange.com/questions/66642/detecting-invalid-wkt-in-text-column-in-sql-server有一个简单的SP,它在try catch块中包装GEOMETREY::STGeomFromText
。
但是,存储过程不能CROSS APPLY
编辑(或从可能的UDF调用),因此这将导致基于游标的解决方案。
UDF可以交叉应用,但不能有TRY-CATCH
块。您也无法从UDF调用上述SP。所以没那么多用。
将GEOMETREY::STGeomFromText
调用包装在可以为CROSS APPLIED
的CLR UDF中,可以尝试catch和其他错误检查,规则等,并返回指示有效文本的标志。我还没试过这个,但如果你的环境中启用了CLR,这听起来是最好的选择。
希望这会给你一些想法。对这些建议的评论中的反馈表示赞赏。