首先,我创建了一个名为Placemarks
的表格,其中包含“地理位置”类型的列。
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过滤出行。
但我将来可能会使用geometry数据类型,并希望查询向前兼容。还有其他想法吗?
答案 0 :(得分:5)
其他行由systypes
上的联接引入。将连接条件更改为
inner join systypes c on b.xtype = c.xtype and b.xusertype=c.xusertype
似乎有效。您应该使用sys.columns, sys.types
等代替已弃用的syscolumns, systypes
向后兼容性视图。
答案 1 :(得分:4)
我建议您使用较新的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'
至少在我的情况下,我现在得到:
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