如何判断一列是否为系统名类型?

问题描述 投票:0回答:1

如何通过查询系统列找到表中的列,这是一个常见的问题。 比如说 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 的类型?

sql-server sqldatatypes system-tables
1个回答
1
投票

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';

1
投票

首先,没有有效的案例可以将数据存储为 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

更新

我刚刚在一台服务器上检查了类型的记录,在那里我的数据库有不同的整理,并注意到整理会改变,以匹配数据库的。因此,即使在同一台服务器上,使用该别名也会导致整理的问题

© www.soinside.com 2019 - 2024. All rights reserved.