Невозможно создать строку размером 8081, которая превышает максимально допустимый размер строки 8060

Я проверил каждую ссылку stackru (я тоже перестраиваю таблицу) и другие ссылки, но не повезло.

Я должен проанализировать одно приложение. Итак, я получил файл резервной копии через утилиту приложения по определенному пути. Я восстановил файл резервной копии в 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') 

Является ли предел для полей символов, но я проверил всю длину со значениями и не получаю никакой логики за ошибкой.

Вопрос в том, как устранить ошибку и почему она возникает?

3 ответа

Решение

Я не эксперт по SQL Server, но... добавив всю длину поля выше, я получил 4,046 (Я мог сделать несколько ошибок - здесь слишком рано, и я все еще на первом кофе...). Теперь посмотрим на руководство:

nchar [(n)] Строковые данные Unicode фиксированной длины. n определяет длину строки и должен быть значением от 1 до 4000. Размер хранилища составляет два раза n байтов. Когда кодовая страница сопоставления использует двухбайтовые символы, размер хранилища по-прежнему составляет n байтов. В зависимости от строки размер хранилища n байтов может быть меньше значения, указанного для n. Синонимы ISO для nchar - национальный символ и национальный символ.

Обратите внимание, что для хранения каждого символа требуется два байта. дела 2 * 4046 у нас есть 8092 длина строки в байтах! Также обратите внимание, что nchar это фиксированная длина, которая, я полагаю, выделяется при создании записи / строки, и, таким образом, она генерирует ошибку, которую вы видите, сообщая вам, что строка слишком длинная. Я ожидаю, что это предупредит вас по крайней мере, когда вы создаете таблицу...

Решения

  1. нормализуйте больше: разделите таблицу на две части, например, emploeeyAddress таблица, которая может иметь смысл, если вам позже понадобятся домашний и рабочий адреса для каждого сотрудника

  2. использование nvarchar которая является переменной или динамической длиной. Память по-прежнему составляет 2 байта на символ, но только для вставленных данных (без предварительного выделения). Вы достигнете того же предела, если попытаетесь заполнить все поля до их максимальной длины

Для значений nchar каждый символ использует два байта, поэтому вы должны умножить количество символов на два, чтобы получить общий размер строки.

Наконец-то я получил решение. Я нахожусь в фазе анализа, поэтому я не могу изменить в таблице нормализации.

Прочитав эту ссылку ниже, я понимаю проблему. Так что я просто воссоздал таблицу "Сотрудник" с nvarchar Тип данных, как у меня есть только вариант.

Спасибо @urban, чтобы дать правильное направление и за это я принимаю его ответ.

В чем разница между char, nchar, varchar и nvarchar в SQL Server?

Другие вопросы по тегам