自从对您的问题发表简短评论以来,我有机会充分尝试这些选项。目前看来(即使尝试 .NET 4.6 和 SQL 2014)您无法设置SqlGeography
OR SqlGeometry
as the typeof()
定义列时的参数DataTable
。为了绝对清楚起见,您可以在 .NET 中执行此操作,甚至填充它,但随后您无法将该表作为 TVP 传递给存储过程。
有两种选择。
选项 1. 以 WKT 格式传递值。
按如下方式定义您的表类型。
CREATE TYPE [dbo].[WKT_Example] AS TABLE
(
[geom] [varchar](max) NOT NULL
)
然后按如下方式定义您的存储过程。
CREATE PROCEDURE [dbo].[BulkInsertFromWKT]
@rows [dbo].[WKT_Example] READONLY
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[Table1]
([SpatialData])
SELECT
geometry::STGeomFromText(R.[SpatialData], 4326)
FROM
@rows R;
END
按如下方式定义 .NET 数据表:
DataTable wktTable = new DataTable();
wktTable.Columns.Add("SpatialData", typeof(string));
按如下方式填充它:
for (int j = 0; j < geometryCollection.Count; j++)
{
System.Data.SqlTypes.SqlString wkt = geometryCollection[j].STAsText().ToSqlString();
wktTable.Rows.Add(wkt.ToString());
}
选项 2. 以 WKB 格式传递值。
按如下方式定义您的表类型。
CREATE TYPE [dbo].[WKB_Example] AS TABLE
(
[geom] [varbinary](max) NOT NULL
)
然后按如下方式定义您的存储过程。
CREATE PROCEDURE [dbo].[BulkInsertFromWKB]
@rows [dbo].[WKB_Example] READONLY
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[Table1]
([SpatialData])
SELECT
geometry::STGeomFromWKB(R.[SpatialData], 4326)
FROM
@rows R;
END
按如下方式定义 .NET 数据表:
DataTable wkbTable = new DataTable();
wkbTable.Columns.Add("SpatialData", typeof(System.Data.SqlTypes.SqlBytes));
按如下方式填充它:
for (int j = 0; j < geometryCollection.Count; j++)
{
wkbTable.Rows.Add(geographyCollection[j].STAsBinary());
}
Notes:
如下定义 SqlParameter:
SqlParameter p = new SqlParameter("@rows", SqlDbType.Structured);
p.TypeName = "WKB_Example"; // The name of your table type
p.Value = wkbTable;
我在地理作业中留下了 SRID 4326。您可以将其更改为您想要的任何内容 - 事实上,如果您正在使用Geography
我建议将其作为第二个参数,以便为您提供灵活性。
此外,如果性能至关重要,您会发现使用 WKB 更好。我的测试发现,WKB 的完成时间是 WKT 所用时间的 45% 到 65%。这将根据数据的复杂性和设置而有所不同。
您找到的有关指定参数的信息UdtTypeName
当您的存储过程具有 [Geometry] 或 [Geography] 类型的参数时,“Geometry”/“Geography”是正确的。它不适用于 TVP。