Member 14057347 Ответов: 2

Ошибка преобразования при преобразовании значения 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],
		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],
			[part.Note],
			[Col4],
			[Col5],
			[Col6],
			[Col7],
			[Col8],
			[Col9],
			[Col10],
			[CurrentRecord])

VALUES (    SOURCE.[PlantID]
           ,SOURCE.[PartID]
           ,SOURCE.[PartNo]
           ,SOURCE.[Col1]
           ,SOURCE.[Col2]
           ,SOURCE.[Col3]
           ,SOURCE.[part.Note]
           ,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 не может распознать это в чем-то похожем на формат UTF-8. У нас есть много таких полей в других таблицах, и они прекрасно работают и отображают данные.

F-ES Sitecore

Вы делаете что-то в SP, что заставляет его пытаться преобразовать PartNote в int. Таким образом, вы, возможно, сравниваете его с int или вставляете его в поле, которое является int.

Santosh kumar Pithani

Вы не знаете, как написать условие слияния и команду обновления ?

CHill60

Не делайте репостов!

Member 14057347

Santosh - оператор MERGE теперь исправлен. Это никогда не было проблемой, это была просто опечатка.

Ф-Эс компания:

Этот вопрос конкретно связан с полем PartNote. Если я прокомментирую это, запрос будет выполнен безупречно. Поле PartNote определяется как NVARCHAR(500) в ERP-системе, промежуточных таблицах и целевых таблицах. Так что я действительно не могу понять, почему он не распознает его в этом пертикулярном запросе. Поскольку это поле примечания, для него не существует ограничений по типу данных или языку. Она может включать в себя все и вся!
Есть ли какой-нибудь способ определить, что может быть причиной этого? Я также пытался устранить и заменить специальные символы ASCII, но это тоже не помогло.

CHill60

Оператор merge не исправлен - см. мое решение 2

Santosh kumar Pithani

Затем создается проблема в вашем запросе слияния.Мое решение неверно?

2 Ответов

Рейтинг:
18

CHill60

Решение 1 исправило две фундаментальные ошибки в вашем коде но не сделало их особенно ясными особенно путем перемещения ORs. Вот исправление синтаксических ошибок, которые вы генерируете.

В вашем предложении WHEN MATCHED вы имеете

TARGET.[PartNote] <> SOURCE.[PartNote],
Так и должно быть
TARGET.[PartNote] <> SOURCE.[PartNote] OR
В вашем предложении THEN UPDATE у вас есть
,TARGET.[PartNote] = SOURCE.[PartNote],
Эта последняя запятая не должна быть там, так как ваш код эффективно
...= ИСТОЧНИК.[PartNote] ,, ЦЕЛЬ.[Col4] = источник.[Col4]

[Правка] заметил еще один ... в вашем предложении WHEN NOT MATCHED у вас есть (в двух местах)
[part.Note],
Так и должно быть
[PartNote],


Рейтинг:
0

Santosh kumar Pithani

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],
			[part.Note],
			[col4],
			[col5],
			[col6],
			[col7],
			[col8],
			[col9],
			[col10],
			[CurrentRecord])

VALUES (    SOURCE.[PlantID]
           ,SOURCE.[PartID]
           ,SOURCE.[PartNo]
           ,SOURCE.[col1]
           ,SOURCE.[col2]
           ,SOURCE.[col3]
           ,SOURCE.[part.Note]
           ,SOURCE.[col4]
           ,SOURCE.[col5]
           ,SOURCE.[col6]
           ,SOURCE.[col7]
           ,SOURCE.[col8]
           ,SOURCE.[col9]
		   ,SOURCE.[col10]
           ,SOURCE.[CurrentRecord]);</blockquote>