[英]How to tell whether a column is of sysname type
如何通过查询系统列来查找表中的列是一个常见问题。 例如SQL 服务器查询以获取表中的列列表以及数据类型,NOT NULL 和 PRIMARY KEY 约束提供了在大多数情况下都有效的查询。 但是,类型为sysname
的列作为普通nvarchar
返回。 在 Management Studio (SSMS) 中编写表定义脚本将正确地给出sysname
类型。 sp_columns
。 但是,如何使用针对系统表的 SQL 查询来查找列是否属于sysname
类型? (我不想为每个表单独运行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'
我查看了sp_columns
的定义,看看我是否可以做同样的事情。 它在系统表sys.spt_columns_odbc_view
中查找列详细信息。 但这显然是一些绝密内部表,只能从直接管理员连接 (DAC) 或 SSMS 中查询。 (请参阅什么是 spt_columns_odbc_view 以及为什么它无法访问? )即使我没有从 Management Studio 或通过 DAC 运行sp_columns
proc,它也会设法查询此视图。 但我不知道如何在我自己的代码中重复这个技巧。
是否有其他方法可以判断列是否为sysname
类型?
首先,没有将数据存储为sysname
的有效案例,即使对于维护脚本也是如此。 对于脚本,您需要表或列的实际名称,因此将其存储在nvarchar(128)
字段中非常好。
系统本身将sysname
视为sys.types
表中的用户类型。 如果您检查记录,您会看到数据库本身告诉您这是一个nvarchar
。 如果要返回该别名,请使用types.user_type_id
加入sys.columns.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
更新
我刚刚检查了服务器上的类型记录,在该服务器上我使用不同的排序规则进行数据库化,并注意到排序规则更改为与数据库匹配。 因此,即使在同一台服务器上,使用该别名也会导致排序问题
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
创建的 UDT 不同之处在于sys.types
的is_user_defined
列将为零而不是一,因为它是由 SQL 服务器而不是用户定义的。
还可以加入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';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.