繁体   English   中英

如何判断列是否属于 sysname 类型

[英]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.typesis_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM