Sql server Alter column length不更新syscolumns length

Sql server Alter column length不更新syscolumns length,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我有一个带有NVARCHAR8000字段的现有表。我还有一个过程,它通过检查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.xscal

我有一个带有NVARCHAR8000字段的现有表。我还有一个过程,它通过检查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

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

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

-1=列数据类型为varcharmax、nvarcharmax、varbinarymax或xml

对于文本列,最大长度值将为16或由设置的值 sp_table选项“行中文本”

对于NVARCHAR:

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

这意味着,任何NVARCHAR和NCHAR列的报告最大长度将是允许长度的2倍,NVARCHARMAX和CHARMAX除外,在这种情况下,您将看到-1

顺便说一句,syscolumns已被弃用,请改用sys.columns

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

-1=列数据类型为varcharmax、nvarcharmax、varbinarymax或xml

对于文本列,最大长度值将为16或由设置的值 sp_table选项“行中文本”

对于NVARCHAR:

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

这意味着,任何NVARCHAR和NCHAR列的报告最大长度将是允许长度的2倍,NVARCHARMAX和CHARMAX除外,在这种情况下,您将看到-1

顺便说一句,syscolumns已被弃用,请改用sys.columns。

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

此外,NVARCHAR8000甚至不可能,您可以使用高达4000的长度值,也可以使用特殊的关键字MAX,该关键字将其限制为2GB,但如果需要,可以使用与表分开存储的值。

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


此外,NVARCHAR8000甚至不可能,您可以使用高达4000的长度值,也可以使用特殊的关键字MAX,该关键字将其限制为2GB,但如果需要,可以使用与表分开存储的值。

可能原因:NVARCHAR每个字符存储2个字节,2*4000=8000。NVARCHAR8000甚至是不可能的,它要么是一个高达4000的值,要么是一个最大值。@PeterB-你是正确的:只需在一个单独的255字段上进行检查,该字段在syscolumns中报告510。我将更新我的审计创建存储过程,以便在NVARCHAR中将该数字减半。把它扔进去回答,我就接受。谢谢很惊讶你可以声明一个nvarchar8000。nvarchar的最大大小是4000。如果需要更多字符,则必须使用nvarcharMAX。运行查询DECLARE@n nvarchar8000;将返回错误,参数'@n'的大小8000超过了允许的最大值4000。@Larnu-实际上不能这样做-我不知怎么搞混了,但我刚刚验证了您不能创建nvarchar8000。我认为这不再是一个问题。OP误解了返回的数据。nvarchar4000报告长度为8000是100%准确的。可能原因:NVARCHAR每个字符存储2个字节,2*4000=8000。NVARCHAR8000甚至是不可能的,它要么是一个高达4000的值,要么是一个最大值。@PeterB-你是正确的:只需在一个单独的255字段上进行检查,该字段在syscolumns中报告510。我将更新我的审计创建存储过程,以便在NVARCHAR中将该数字减半。把它扔进去回答,我就接受。谢谢很惊讶你可以声明一个nvarchar8000。nvarchar的最大大小是4000。如果需要更多字符,则必须使用nvarcharMAX。运行查询DECLARE@n nvarchar8000;将返回错误,参数'@n'的大小8000超过了允许的最大值4000。@Larnu-实际上不能这样做-我不知怎么搞混了,但我刚刚验证了您不能创建nvarchar8000。我认为这不再是一个问题。OP误解了返回的数据。nvarchar4000报告长度为8000是100%准确的。