我检查了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字段的限制,但是我使用值检查了所有长度,并且没有得到任何逻辑错误。
所以问题是如何解决错误及其原因?
答案 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
是固定长度我假设在创建条目/行时分配它,因此它会生成您看到的错误,告诉您该行太长。我希望它至少在你创建表时警告你......
规范化更多:将表拆分为两个,例如有一个emploeeyAddress
表,如果您以后需要每个员工的家庭和工作地址,这是有意义的
使用可变或动态长度的nvarchar
。存储仍然是每个字符2个字节,但仅用于插入的数据(未预先分配)。如果您尝试将所有字段填充到其最大长度
答案 1 :(得分:0)
对于nchar值,每个字符使用两个字节,因此您应该将字符数乘以2以获得总行大小。
答案 2 :(得分:0)
最后我得到了解决方案。我处于分析阶段,因此无法在规范化表中进行更改。
阅读以下链接后,我理解了这个问题。所以我只是重新创建了一个"员工"具有nvarchar
数据类型的表,因为我只有选项。
感谢@urban给出了正确的方向,为此我接受了他的回答。
What is the difference between char, nchar, varchar, and nvarchar in SQL Server?