sql-server-2008 - 每个 'geography' 类型的列的 syscolumns 中的多个条目

标签 sql-server-2008 geospatial

首先,我创建了一个名为 Placemarks 的表,其中包含一个类型为“geography”的列。

CREATE TABLE [dbo].[Placemarks](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Location] [geography] NOT NULL,
CONSTRAINT [PK_Placemarks] 
    PRIMARY KEY CLUSTERED([ID] ASC)
)

然后,我在存储过程中使用以下查询来获取表中所有列及其数据类型的列表。
SELECT 
   b.name, c.name as TypeName, b.length, b.isnullable, b.collation, b.xprec, b.xscale
FROM sysobjects a 
inner join syscolumns b on a.id = b.id 
inner join systypes c on b.xtype = c.xtype and c.name <> 'sysname' 
WHERE a.id = object_id(N'[dbo].[Placemarks]') 
and OBJECTPROPERTY(a.id, N'IsUserTable') = 1 
ORDER BY b.colId

查询结果可以在这里查看:

我在存储过程中使用此查询,需要为 Placemarks 表中的每一列获取一行。我可以用 TypeName = geometry 或hierarchyid 过滤掉行。

但是我将来可能会使用几何数据类型并希望查询向前兼容。还有其他想法吗?

最佳答案

我建议使用较新的 sys 系统目录 View ,而不是旧的 sysobjects 和类似 View ——它们很快就会被删除。

通过这个查询,你应该得到你想要的结果:

SELECT
    c.name 'ColName',
    ty.Name 'TypeName',
    c.max_length, c.is_nullable, c.collation_name, c.precision, c.scale
FROM
    sys.tables t
INNER JOIN 
    sys.columns c ON t.object_id = c.object_id
INNER JOIN  
    sys.types ty ON c.user_type_id = ty.user_type_id
WHERE   
    t.name = 'Placemarks'

至少在我的情况下,我现在得到:
ColName  TypeName    max_length is_nullable  collation_name  precision  scale
ID       int           4            0        NULL                10       0
Name     nvarchar    100            0        Latin1_General_CI_AS 0       0
Location geography    -1            0        NULL                 0       0

关于sql-server-2008 - 每个 'geography' 类型的列的 syscolumns 中的多个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8164841/

相关文章:

sql-server - 如何查询当前用户的角色

sql-server - SQL 查询 - COUNT 用于单个表中两列或更多列的组合

c# - 无法对 SQL Server Express 2008 使用 SQL Server 身份验证

c# - Lucene.Net 创建空索引

map - 从 garmin 读取信息

r - 计算 2 个经纬度之间的距离

sql - case语句执行代码

java - 在 java 中为 mongodb 创建地理空间查询

indexing - 在 Marklogic 中创建没有父级的地理空间对索引

google-maps-api-3 - 地理距离 : Wolfram Alpha not agreeing with Google Maps API