我已经看过很多次这个问题了,其中大多数都以逻辑解释结束。我的表似乎没有接近最大行大小。
My Dev Server是SQL 2008 Express Edition
这是我的表定义。我有一个varchar(max)列,其余的列应该很小。 “备注”提交的文本不多,只有几个字符。
CREATE TABLE [dbo].[PegBoard](
[ID] [int] IDENTITY(1,1) NOT NULL,
[OwnersCorporationID] [int] NOT NULL,
[PegNumber] [int] NOT NULL,
[DepositRequired] [bit] NOT NULL,
[KeyRegister] [bit] NOT NULL,
[Notes] [varchar](max) NULL,
[Locked] [bit] NOT NULL,
[NonLoanable] [bit] NULL,
[DepositAmount] [decimal](10, 2) NULL,
[LastReviewedDate] [datetime] NULL,
CONSTRAINT [PK_PegBoard] PRIMARY KEY NONCLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
CONSTRAINT [PegBoard_PN_Cnst] UNIQUE NONCLUSTERED
(
[PegNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
当我插入一行时,我收到以下消息。
错误:System.Data.SqlClient.SqlException:无法创建一行大小 8066,大于允许的最大行大小8060。
该声明已被终止。 当我向表中添加新列时,我看到了类似的警告,但直到现在它似乎都没有导致失败。
任何可能导致此问题的想法以及我可能尝试解决的问题。
先谢谢 大卫
如果有帮助,这是我的审计表的结构。 触发器本身非常复杂,因为它是从我发现的自动执行所有表的一些代码生成的。
CREATE TABLE [dbo].[Audit](
[AuditID] [int] IDENTITY(1,1) NOT NULL,
[Type] [char](1) NULL,
[TableName] [varchar](128) NULL,
[PrimaryKeyField] [varchar](1000) NULL,
[PrimaryKeyValue] [varchar](1000) NULL,
[FieldName] [varchar](128) NULL,
[OldValue] [varchar](1000) NULL,
[NewValue] [varchar](1000) NULL,
[UpdateDate] [datetime] NULL,
[UserName] [varchar](128) NULL
)ON [PRIMARY]
答案 0 :(得分:1)
一个常见的误解是,在任何情况下使用VARCHAR(MAX)都是个好主意......如果你真的需要处理大于8000字节的字符串,你可以考虑VARBINARY(MAX)
或{{1 }}
阅读本文:https://www.simple-talk.com/sql/database-administration/whats-the-point-of-using-varchar(n)-anymore/
VARCHAR(MAX)的另一个问题是,在某些语句中,隐式使用的数据类型是" normal" varchar,你需要额外的演员表: 阅读:https://stackoverflow.com/a/33031838/5089204
Conclusio:如果你不想要真正大的文本,最好使用XML
定义。