Member 14057347 Ответов: 1

Не удалось выполнить преобразование Sql при преобразовании значения nvarchar в тип данных int.


Всем Привет,
Я борюсь с этим уже несколько дней. Я использую SQL SERVER v17.5

Я перепробовал много предложений и решений со всего интернета, но, похоже, не могу избавиться от этой ошибки. Эта процедура работает безупречно, пока я не попытаюсь добавить часть.Примечание колонка (в соответствии с новыми бизнес-требованиями). Он хранится как nvarchar(500) в исходной таблице и в любой другой таблице, с которой я работаю. Я пробовал COLLATION, CAST, CONVERT, ISNUMERIC(), даже отдельный оператор update! Кажется, ничего не работает.
Я здесь на пределе своих возможностей. Может ли кто-нибудь пролить свет на это? Я посмотрел на что-то, связанное с CLR, и не уверен, имеет ли это какое-то отношение к оператору MERGE и/или серверу, к которому он пытается подключиться. Пожалуйста, помогите!

Заранее спасибо :)

Вот мой запрос:=

USE [SomeDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_RegionalPart]
	
@RegionID as int 
AS
BEGIN

Declare @sql as nvarchar(max)
Declare @sqltrunc as nvarchar(max)
Declare @dbase as nvarchar(100)

if @RegionID = 1 
	Select @dbase = 'USE NorthAmericanDW'
if @RegionID = 2
	Select @dbase = 'USE SouthAmericanDW'
if @RegionID = 3 
	Select @dbase = 'USE EuropeanDW'
if @RegionID = 4
	Select @dbase = 'USE AsianPacificDW'

If OBJECT_ID('tempdb.dbo.#tmp') is not null drop table tempdb.dbo.#tmp

Create Table #tmp
	([PlantID] [INT] NULL
	,[PartID] [int] NULL
	,[PartNo] [nvarchar] (100) NULL
	,[Col1] [int] NULL
	,[Col2] [int] NULL
	,[Col3] [int] NULL
	,[PartNote] [nvarchar] (500) NULL
	,[Col4] [int] NULL
	,[Col5] [float] NULL
	,[Col6] [nvarchar](20) NULL
	,[Col7] [datetime] NULL
	,[Col8] [int] NULL
	,[Col9] [varchar](1) NULL
	,[Col10] [float] NULL
	,[CurrentRecord] [bit] NULL)

PRINT 'Temp Table Created'

Select @sqltrunc = 'Truncate Table ' + Replace(@dbase,'USE ',Space(0)) + '.dbo.RegionalPart'
exec(@sqltrunc)

PRINT 'Table Truncated'

Select @Sql = @dbase + space(1) +
				'SELECT 
				PlantID
				,PartID
				,PartNo
				,Col1
				,Col2
				,Col3
				,Part.Note
				,Col4
				,Col5
				,Col6
				,Col7
				,Col8
				,Col9
				,Col10
				,CurrentRecord

				FROM PartTABLE part
				INNER JOIN 1
				INNER JOIN 2
				INNER JOIN 3
				INNER JOIN 4
				INNER JOIN 5
				LEFT JOIN 1
				WHERE 1=1 
				AND join2.regionid =  ' + cast(@RegionID as nvarchar(1)) 

PRINT @sql

Insert Into #tmp 
exec sp_executesql  @sql

PRINT 'Insert values in #Tmp'


Select @sql = @dbase + space(1) +
'MERGE dbo.RegionalPart AS TARGET 
USING #tmp AS SOURCE 
ON (TARGET.PlantID = SOURCE.PlantID and TARGET.PartID = SOURCE.PartID ) 

WHEN MATCHED AND 
	   (TARGET.[PartNo] <> SOURCE.[PartNo] OR
		TARGET.[Col1]  <> SOURCE.[Col1] OR
		TARGET.[Col2]  <> SOURCE.[Col2] OR
		TARGET.[Col3]  <> SOURCE.[Col3] OR
		TARGET.[PartNote] <> SOURCE.[PartNote] OR
		TARGET.[Col4]  <> SOURCE.[Col4] OR
		TARGET.[Col5]  <> SOURCE.[Col5] OR
		TARGET.[Col6]  <> SOURCE.[Col6] OR
		TARGET.[Col7]  <> SOURCE.[Col7] OR
		TARGET.[Col8]  <> SOURCE.[Col8] OR
		TARGET.[Col9] <> SOURCE.[Col9] OR
		TARGET.[Col10]  <> SOURCE.[Col10])
THEN 
	UPDATE 
	SET TARGET.[PartNo]  = SOURCE.[PartNo] 
		,TARGET.[Col1]  = SOURCE.[Col1] 
		,TARGET.[Col2]  = SOURCE.[Col2] 
		,TARGET.[Col3]  = SOURCE.[Col3] 
		,TARGET.[PartNote] = SOURCE.[PartNote]
		,TARGET.[Col4]  = SOURCE.[Col4] 
		,TARGET.[Col5]  = SOURCE.[Col5] 
		,TARGET.[Col6]  = SOURCE.[Col6] 
		,TARGET.[Col7]  = SOURCE.[Col7] 
		,TARGET.[Col8]  = SOURCE.[Col8] 
		,TARGET.[Col9] = SOURCE.[Col9] 
		,TARGET.[Col10]  = SOURCE.[Col10]

WHEN NOT MATCHED BY TARGET THEN 
INSERT 
           ([PlantID]
			,[PartID]
			,[PartNo]
			,[Col1]
			,[Col2]
			,[Col3]
			,[PartNote]
			,[Col4]
			,[Col5]
			,[Col6]
			,[Col7]
			,[Col8]
			,[Col9]
			,[Col10]
			,[CurrentRecord])

VALUES (    SOURCE.[PlantID]
           ,SOURCE.[PartID]
           ,SOURCE.[PartNo]
           ,SOURCE.[Col1]
           ,SOURCE.[Col2]
           ,SOURCE.[Col3]
           ,SOURCE.[PartNote]
           ,SOURCE.[Col4]
           ,SOURCE.[Col5]
           ,SOURCE.[Col6]
           ,SOURCE.[Col7]
           ,SOURCE.[Col8]
           ,SOURCE.[Col9]      
           ,SOURCE.[Col10]
           ,SOURCE.[CurrentRecord]);'


PRINT  'INSERT STATEMENT: ' 
PRINT @SQL

exec sp_executesql  @sql


PRINT  'INSERT STATEMENT AFTER EXECUTION: ' 
PRINT @SQL


Drop Table #tmp

End


Что я уже пробовал:

Я использую SQL SERVER v17.5
Я уже пробовал:

ПРЕОБРАЗОВАТЬ,
БРОСАТЬ,
Статистика()
инструкция update
СОПОСТАВЛЕНИЯ,

CHill60

Какой тип данных-столбец dbo.RegionalPart.[Партнер] ?

Member 14057347

Тип nvarchar(500)

Я не собирался делать репост. Новичок на сайте и в конечном итоге создал 2 вопроса вместо одного. Есть ли способ объединить их вместе?

Member 14057347

Кроме того, когда я бросаю этот столбец при создании своей временной таблицы, он не выдает никаких ошибок. Я также попытался создать правильную таблицу вместо временной таблицы, чтобы увидеть, имеет ли это значение.
Он выдает ошибку только тогда, когда пытается вставить строки в целевую таблицу. Я также попытался воссоздать целевую таблицу, чтобы убедиться, что там нет конфликтов типов данных.

1 Ответов

Рейтинг:
2

OriginalGriff

Прочтите сообщение об ошибке:

Sql conversion failed when converting the nvarchar value to data type int.
Это довольно ясно.
Где - то в этом объеме кода значение NVARCHAR (вероятно, из столбца) преобразуется в INT-но содержащееся в нем значение не является числовым (или плавающей точкой) и не может быть преобразовано. Скорее всего, это проблема с данными, и у нас нет никакого доступа к вашим данным.

Поэтому начните с того, что внимательно посмотрите на собранное вами утверждение:
exec sp_executesql @sql
постройте и замените его оператором печати. Посмотрите на то, что напечатано очень внимательно. Выясните, что может быть преобразовано и откуда это происходит.

Мы ничего не можем сделать для вас!


Member 14057347

Приношу свои извинения за поздний ответ.
I have been examining the code and every column as you suggested. The issue is specifically with PartNote column. Even if I force CAST or CONVERT that field (the usual remedy for the said error) it doesn't seem work with whatever data that is in this column. If I remove PartNote column from the query, it runs without any issue. As this is a note field, it has no data type restriction for the front end user. Also, the data comes from various countries so it could be mixed with different languages so it is impossible for to see where the issue would be. Is there any way I can cast/convert it or use some other advanced function? When we export it to other applications, we usually convert these to follow UTF-8 data type in SSIS and other integration processes. Can something similar be done in SQL?

F-ES Sitecore

Из того, что вы говорите, вы не можете преобразовать PartNote в int, поскольку данные, которые он представляет, не могут быть преобразованы в int. Вы пытаетесь вставить квадратный колышек в круглое отверстие. Как уже было сказано, это проблема с данными, вы либо используете неправильные типы, либо не проверяете их...нам трудно это понять.

Member 14057347

Да, query пытается преобразовать PartNote в int, когда это не должно быть сделано. Он определяется как nvarchar(500) в исходной таблице, а также приводится как nvarchar(500) при создании временной таблицы (которая прекрасно работает сама по себе) и также определяется как nvarchar(500) в целевой таблице. Почему SQL пытается преобразовать его в Int? Я знаю, что в этом поле есть чешские иероглифы, такие как "Forma č", а также Китайские. Будет ли это иметь какое-то отношение к этой ошибке?

OriginalGriff

Какой именно? Вы используете его три раза: сравнение, обновление и вставка. Если вы удалите сравнение, но оставите два других, вы все равно получите ошибку?

Member 14057347

Оператор INSERT, когда я усекаю таблицу и каждый раз заново заполняю ее. Теперь, когда я думаю об этом, обновление здесь избыточно (старый код)

OriginalGriff

Вставка использует другое поле:
ОБНОВЛЕНИЕ:
,ЦЕЛЬ.[Col3] = источник.[Col3]
,ЦЕЛЬ.[PartNote] = источник.[PartNote]
ВСТАВЛЯТЬ:
,ИСТОЧНИК.[Col3]
,Источник.[часть.Примечание]
И вставляет его в другую колонку.

Member 14057347

Это была опечатка с моей стороны. Фактический запрос не содержит ошибок в именах столбцов.

CHill60

Попробуйте поделиться этим фактический запрос с нами вместо кода, который полон ошибок ... вы уже печатаете его