Вставьте несколько значений в SQL, не удалось преобразовать - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть таблица SQL:

CREATE TABLE [jato].[option_list](
    [vehicle_id] [bigint] NOT NULL,
    [option_id] [int] NOT NULL,
    [option_type] [varchar](10) NULL,
    [option_code] [varchar](255) NULL,
    [manuf_name] [nvarchar](255) NULL,
    [id_902] [float] NULL,
    [id_903] [float] NULL,
    [id_904] [float] NULL,
    [id_905] [float] NULL,
    [id_100902] [float] NULL,
    [id_100903] [float] NULL,
    [id_100904] [float] NULL,
    [id_100905] [float] NULL,
 CONSTRAINT [PK_OPTIONLIST] PRIMARY KEY CLUSTERED 
(
    [vehicle_id] ASC,
    [option_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Я хочу вставить в нее значения.

Следующий запрос работает:

INSERT INTO jato.option_list 
(vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 

values
(11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0)

, но если Я добавляю другие значения в тот же запрос, я сталкиваюсь с ошибочным преобразованием из varchar в int, тогда как порядок столбцов не изменился. Например, следующий запрос не работает, у меня ошибка при SQL преобразовании 'MG' в int:

INSERT INTO jato.option_list 
(vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 

values
(11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0),
(11688620170510,1190,'O',881,'Automatic boot pull down',635.25,525,0,0,635.25,525,0,0) 

Я не понимаю, что я делаю неправильно.

У кого-нибудь есть идеи?

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Ваша проблема со второй строкой значений:

(11688620170510,1190,'O',881,'Automatic boot pull down',635.25,525,0,0,635.25,525,0,0)

Измените это на:

(11688620170510,1190,'O','881','Automatic boot pull down',635.25,525,0,0,635.25,525,0,0)

Тогда это будет работать. Подводя итог, ваш код должен выглядеть следующим образом:

INSERT INTO dbo.option_list 
(vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 

values
(11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0),
(11688620170510,1190,'O','881','Automatic boot pull down',635.25,525,0,0,635.25,525,0,0)
0 голосов
/ 09 апреля 2020

Фактическая причина ошибки в операторе заключается в том, что вы используете VALUES конструктор табличных значений. В этой ситуации, как объясняется в документации , значения , указанные в многострочном операторе INSERT, соответствуют свойствам преобразования типов данных синтаксиса UNION ALL. Это приводит к неявному преобразованию несопоставленных типов в тип с более высоким приоритетом .

Таким образом, с данными в вопросе значение 'MG' (varchar) из первой строки неявно преобразован в int, потому что у вас есть 881 (int) во второй строке, а тип данных int имеет более высокий приоритет , чем тип данных varchar.

Выполните оператор INSERT одним из следующих способов:

  • Использование одного оператора и подходящего типа данных varchar (значения 'MG' и '881' для столбец option_code)
  • Использование двух отдельных операторов и типов данных varchar и int (значения 'MG' и 881 для столбца option_code)

Single INSERT оператор с соответствующими типами данных:

INSERT INTO dbo.option_list 
(vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 
VALUES
   (11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0),
   (11688620170510,1190,'O','881','Automatic boot pull down',635.25,525,0,0,635.25,525,0,0)

Два INSERT оператора:

INSERT INTO dbo.option_list (vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 
VALUES
   (11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0)

INSERT INTO dbo.option_list (vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905)
VALUES
   (11688620170510,1190,'O',881,'Automatic boot pull down',635.25,525,0,0,635.25,525,0,0)
0 голосов
/ 09 апреля 2020

Итак, я нашел себе ответ. Я должен был ввести значения в одном и том же формате для всех строк.

В моем случае:

INSERT INTO jato.option_list 
(vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 

values
(11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0),
(11688620170510,1190,'O',881,'Automatic boot pull down',635.25,525,0,0,635.25,525,0,0) 

должно было быть:

INSERT INTO jato.option_list 
(vehicle_id,option_id,option_type,option_code,manuf_name,id_902,id_903,id_904,id_905,id_100902,id_100903,id_100904,id_100905) 

values
(11280320191201,1142,'C','MG','Machine Grey Metallic',0,0,0,0,0,0,0,0),
(11688620170510,1190,'O','881','Automatic boot pull down',635.25,525,0,0,635.25,525,0,0) 

Мне пришлось добавить несколько цитаты около 881.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...