syscolumns中的每个"地理"类型列中的多个条目

Omt*_*ara 4 geospatial sql-server-2008

首先,我创建了一个名为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)
)
Run Code Online (Sandbox Code Playgroud)

然后,我在存储过程中使用以下查询来获取表中包含其数据类型的所有列的列表.

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
Run Code Online (Sandbox Code Playgroud)

可以在此处查看查询结果:

查询结果

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

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

Mar*_*ith 5

其他行由连接引入systypes.将连接条件更改为

inner join systypes c on b.xtype = c.xtype and b.xusertype=c.xusertype
Run Code Online (Sandbox Code Playgroud)

似乎工作.您应该使用sys.columns, sys.types等而不是已弃用的syscolumns, systypes向后兼容性视图.


mar*_*c_s 5

我建议使用较新的sys系统目录视图,而不要使用旧的sysobjects和类似的视图-那些将很快被删除。

通过此查询,您应该获得所需的结果:

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'
Run Code Online (Sandbox Code Playgroud)

至少就我而言,我现在得到:

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
Run Code Online (Sandbox Code Playgroud)