【发布时间】:2022-01-17 17:54:24
【问题描述】:
我想通过 python/将 (MULTI)Polygons 写入 SSMS 数据库
insert_query = f"""INSERT INTO [dbo].[{table_name}] ({column_names[0]}, {column_names[1]})
VALUES (?, ?)"""
val = (postal_code, f'geography::STGeomFromText({geovlak} ,4326)')
cursor.execute(insert_query, val)
conn.commit()
如果我打印 f'geography::STGeomFromText({geovlak} ,4326)' 的 1 个实例,我会得到:
geography::STGeomFromText(POLYGON ((4.90638 52.3781, 4.90677 52.378, 4.90643 52.3771, 4.90642 52.3771, 4.90557 52.3772, 4.90549 52.3772, 4.90469 52.3774, 4.90435 52.3775, 4.90432 52.3775, 4.90423 52.3775, 4.90425 52.3776, 4.90427 52.3776, 4.9043 52.3776, 4.90437 52.3777, 4.90438 52.3777, 4.90438 52.3777, 4.90447 52.3778, 4.90448 52.3778, 4.90452 52.3778, 4.90452 52.3778, 4.9046 52.3778, 4.90472 52.3779, 4.9049 52.378, 4.905 52.3781, 4.90502 52.3781, 4.90504 52.3782, 4.90505 52.3782, 4.90509 52.3783, 4.90516 52.3783, 4.90521 52.3782, 4.90523 52.3782, 4.90618 52.3781, 4.90637 52.3781, 4.90638 52.3781)))
这对我来说似乎不错,但随后出现以下错误。
'42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]
A .NET Framework error occurred during execution of user-defined routine or aggregate
"geography": \r\nSystem.FormatException: 24114: The label geography::STGeomFro in the
input well-known text (WKT) is not valid. Valid labels are POINT, LINESTRING, POLYGON,
MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING,
COMPOUNDCURVE, CURVEPOLYGON and FULLGLOBE (geography Data Type
only).\r\nSystem.FormatException: \r\n at
Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(String input)\r\n at
Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type)\r\n at
Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid)\r\n at
Microsoft.SqlServer.Types.SqlGeography.ParseText(OpenGisType type, SqlChars taggedText,
Int32 srid)\r\n at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType
type, SqlChars taggedText, Int32 srid)\r\n at
Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)\r\n. (6522) (SQLExecDirectW);
[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The statement has been
terminated. (3621)'
【问题讨论】:
-
您没有在 SSMS (SQL Server Management Studio) 中插入您正在插入到 SQL Server 数据库。代码
[dbo].[{table_name}] ({column_names[0]}, {column_names[1]})看起来也可以注入。为什么你有动态对象名称?如果您也没有转义所有需要的字符,则将注入的值包装在定界标识符中不会停止注入。
标签: python sql sql-server pyodbc