更改列长度不会更新syscolumns长度

时间:2018-03-16 14:40:05

标签: sql-server sql-server-2014

我有一个包含NVARCHAR(8000)字段的现有表。我还有一个过程,通过检查syscolumns(以及其他)来复制源表模式来构建审计表。

如果我针对现有源表运行以下语句:

ALTER TABLE dbo.MyTable ALTER COLUMN MyColumn NVARCHAR(4000);

然后对syscolumns运行查询:

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].[CalendarEvents]') 
    AND OBJECTPROPERTY(a.id, N'IsUserTable') = 1 
ORDER BY b.colId

... syscolumn长度仍然报告8000而不是新的4000。

有没有办法强制刷新这个?据推测,有一些内部维护会定期更新这些内容,但我不确定规则是什么,并且它干扰了我在更改源列长度后直接构建审计对象的能力表

2 个答案:

答案 0 :(得分:3)

原因是NVARCHAR每个字符存储2个字节,2 * 4000 = 8000。

NVARCHAR(8000)也是不可能的,您可以使用长度值最多4000或特殊关键字MAX,这使得它限制为2GB,但值与表格分开存储如果需要的话。

答案 1 :(得分:1)

  

max_length smallint列的最大长度(以字节为单位)。

     

-1 =列数据类型为varchar(max),nvarchar(max),varbinary(max)或xml。

     

对于文本列,max_length值将为16或由设置的值   sp_tableoption'文本在行'。

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-columns-transact-sql

对于NVARCHAR:

  

实际存储空间大小(以字节为单位)字符数的两倍 ...

https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql

这意味着,任何NVARCHAR和NCHAR列的报告max_lenght将是允许长度的2倍(除了NVARCHAR(MAX)和CHAR(MAX),在这种情况下,你会看到-1)。

BTW,syscolumns已弃用,请改用sys.columns