无法创建大小为8081的行,该行大于允许的最大行大小8060

时间:2015-12-15 08:08:27

标签: sql-server sql-server-2014

我检查了stackoverflow的每个链接(I Rebuild table too)和其他链接,但没有运气。

我必须分析一个应用程序。所以我通过特定路径上的应用程序实用程序获得了备份文件。我正确地恢复了Sqlserver 2014 full version中的备份文件。然后我将应用程序的配置文件更改为此sqlserver。

之后,当运行应用程序并通过应用程序提交员工表单时,会出现上述错误。

员工表数据库结构如下所示,它包含47列且没有任何行(这是第一个条目)。

CREATE TABLE [dbo].[employee](
    [wcsuid] [nchar](30) NULL,
    [lastupdatedate] [nchar](8) NULL,
    [updatedatetime] [varchar](17) NULL,
    [locationid] [nchar](20) NULL,
    [isactive] [nchar](1) NULL,
    [CreatedDate] [varchar](10) NULL,
    [sdate] [nchar](90) NULL,
    [identityemployeeno] [nchar](45) NULL,
    [employeeid] [nchar](180) NULL,
    [firstname] [nchar](120) NULL,
    [lastname] [nchar](120) NULL,
    [ssn] [nchar](99) NULL,
    [dob] [nchar](90) NULL,
    [gender] [nchar](9) NULL,
    [address] [nchar](180) NULL,
    [addressLine2] [nchar](180) NULL,
    [city] [nchar](105) NULL,
    [state] [nchar](180) NULL,
    [zipcode] [nchar](135) NULL,
    [isinternationaladdress] [nchar](9) NULL,
    [telephone] [nchar](126) NULL,
    [cellphone] [nchar](126) NULL,
    [IdentityJobTitleNo] [nchar](45) NULL,
    [manager] [nchar](120) NULL,
    [hiredate] [nchar](90) NULL,
    [terminationdate] [nchar](90) NULL,
    [username] [nchar](90) NULL,
    [userpassword] [nchar](90) NULL,
    [userpassword_required] [nchar](9) NULL,
    [employeestanding] [nchar](180) NULL,
    [identityroleid] [nchar](45) NULL,
    [loggedin] [nchar](9) NULL,
    [punchedin] [nchar](9) NULL,
    [punchedinTime] [nchar](90) NULL,
    [punchedinDate] [nchar](90) NULL,
    [contactname] [nchar](120) NULL,
    [contactaddress] [nchar](180) NULL,
    [contactaddressLine2] [nchar](180) NULL,
    [contactcity] [nchar](105) NULL,
    [contactstate] [nchar](30) NULL,
    [contactzipcode] [nchar](135) NULL,
    [isinternationalcontactaddress] [nchar](9) NULL,
    [contactphone] [nchar](126) NULL,
    [contactcellphone] [nchar](126) NULL,
    [relationtoemployee] [nchar](180) NULL,
    [worksoncommission] [nchar](9) NULL,
    [overrideitemcommission] [nchar](9) NULL
) ON [PRIMARY]

插入语句(也有47个值),错误也在应用程序中显示如下:

INSERT INTO employee
(
wcsuid,lastupdatedate,updatedatetime,locationid,isactive,CreatedDate,sdate,identityemployeeno,employeeid,firstname,lastname,ssn,dob,gender,address,addressLine2,city,state,zipcode,isinternationaladdress,telephone,cellphone,IdentityJobTitleNo,manager,hiredate,terminationdate,username,
userpassword,userpassword_required,employeestanding,identityroleid,loggedin,punchedin,punchedinTime,punchedinDate,contactname,contactaddress,contactaddressLine2,contactcity,contactstate,contactzipcode,isinternationalcontactaddress,contactphone,contactcellphone,relationtoemployee,worksoncommission,overrideitemcommission) 
VALUES 
(
'2015121512201580210002','','20151215122015802','','','20151215','','4','','Ajayendra','Raghuvanshi','','19782707','M','','','','','','','0792762063','','','','00000000','00000000','ajayendra',
'SdYHcqaxf1gMjjSkjmpUiw==','N','','','','','','','','','','','','','','','','','N','N') 

是char字段的限制,但是我使用值检查了所有长度,并且没有得到任何逻辑错误。

所以问题是如何解决错误及其原因?

3 个答案:

答案 0 :(得分:4)

我不是SQL Server专家但是...添加所有字段长度超过我4,046(我可能犯了一些错误 - 这太早了,我还在第一杯咖啡.. )。现在看the manual

  

nchar [(n)]   固定长度的Unicode字符串数据。 n定义字符串长度,并且必须是1到4,000之间的值。存储大小是n个字节的两倍。当排序规则代码页使用双字节字符时,存储大小仍为n个字节。根据字符串,n个字节的存储大小可能小于为n指定的值。 nchar 的ISO同义词是国家字符国家字符 ..

请注意,存储每个字符需要两个字节。做2 * 4046我们有8092个字节的行长!另请注意nchar固定长度我假设在创建条目/行时分配它,因此它会生成您看到的错误,告诉您该行太长。我希望它至少在你创建表时警告你......

解决方案

  1. 规范化更多:将表拆分为两个,例如有一个emploeeyAddress表,如果您以后需要每个员工的家庭和工作地址,这是有意义的

  2. 使用可变或动态长度的nvarchar。存储仍然是每个字符2个字节,但仅用于插入的数据(未预先分配)。如果您尝试将所有字段填充到其最大长度

  3. ,则会达到相同的限制

答案 1 :(得分:0)

对于nchar值,每个字符使用两个字节,因此您应该将字符数乘以2以获得总行大小。

答案 2 :(得分:0)

最后我得到了解决方案。我处于分析阶段,因此无法在规范化表中进行更改。

阅读以下链接后,我理解了这个问题。所以我只是重新创建了一个"员工"具有nvarchar数据类型的表,因为我只有选项。

感谢@urban给出了正确的方向,为此我接受了他的回答。

What is the difference between char, nchar, varchar, and nvarchar in SQL Server?