Sql server Alter column length不更新syscolumns length
我有一个带有NVARCHAR8000字段的现有表。我还有一个过程,它通过检查syscolumns等来复制源表模式,从而构建审计表 如果对现有源表运行以下语句: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
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%准确的。