我有一个包含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。
有没有办法强制刷新这个?据推测,有一些内部维护会定期更新这些内容,但我不确定规则是什么,并且它干扰了我在更改源列长度后直接构建审计对象的能力表
答案 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'文本在行'。
对于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
。