如何通过查询系统列找到表中的列,这是一个常见的问题。 比如说 SQL服务器查询获取表中列的列表以及数据类型、NOT NULL和主键约束。 给出了一个在大多数情况下都有效的查询。 然而,一个类型为 sysname
以纯文本形式返回 nvarchar
. 在Management Studio (SSMS)中,用脚本写出一个表的定义,将正确地给出以下信息 sysname
型。 也将 sp_columns
. 但我怎样才能找到一列是否属于 sysname
(我不想在系统表上使用SQL查询,而是要在系统表上运行 sp_columns
分别为每张表命名)。)
如果你想知道什么是 sysname
类型是开始。什么是SQL Server中的SYSNAME数据类型? 给出了一些信息。
为了给大家提供更详细的信息。
create view some_table_names as select name from sys.tables
然后运行
sp_columns 'some_table_names'
报告 type_name=sysname
. 但对sys.columns进行简单的查询,只得到了 varchar
:
select type_name(c.system_type_id)
from sys.objects t
join sys.columns c
on t.object_id = c.object_id
where t.name = 'some_table_names'
我看了一下 "A "的定义。sp_columns
看看我是否可以做同样的事情。 它在系统表中查找列的详细信息。sys.spt_columns_odbc_view
. 但这显然是一些绝密的内部表,只能从直接管理员连接(DAC)或从SSMS查询。 (参见 什么是spt_columns_odbc_view,为什么不能访问?) sp_columns
proc设法查询这个视图,即使我没有从Management Studio或通过DAC运行它。 但我不知道如何在自己的代码中重复这个技巧。
有没有其他的方法来判断一个列是否属于 sysname
的类型?
该 sys.types
目录视图公开了可以在DDL中指定的数据类型。您可以在 user_type_id
来识别列类型。从这个查询可以看出。sysname
不是内部秘密类型。
SELECT c.Name AS ColumnName, ty.name AS TypeName, c.max_length AS ColumnLengthBytes
FROM sys.objects t
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
WHERE t.name = N'test_table';
sysname
是类似于用户定义类型。它不同于用 CREATE TYPE
以致于 is_user_defined
一列 sys.types
将会是0而不是1,因为它是由SQL Server而不是用户定义的。
我们也可以在 system_type_id
来同时返回用户和基本系统类型。
SELECT c.Name AS ColumnName, ty.name AS TypeName, c.max_length AS ColumnLengthBytes
FROM sys.objects t
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types ty ON ty.system_type_id = c.system_type_id
WHERE t.name = N'test_table';
首先,没有有效的案例可以将数据存储为 sysname
即使是维护脚本。对于脚本来说,你需要表或列的实际名称,所以将其存储在 nvarchar(128)
场是完全可以的。
系统本身对 sysname
作为用户类型在 sys.types
表。如果你检查记录,你会发现数据库本身告诉你这是一个 nvarchar
. 如果你想返回那个别名,请加入到我们的 sys.columns.user_type_id
列有 types.user_type_id
譬如说:
select object_name(object_id),
types.name,
*
from sys.columns
inner join sys.types on types.user_type_id =sys.columns.user_type_id
where columns.user_type_id=256
或只是
select object_name(object_id),
TYPE_NAME(user_type_id),
*
from sys.columns
where user_type_id=256
更新
我刚刚在一台服务器上检查了类型的记录,在那里我的数据库有不同的整理,并注意到整理会改变,以匹配数据库的。因此,即使在同一台服务器上,使用该别名也会导致整理的问题