Ошибка преобразования при преобразовании значения 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
Затем создается проблема в вашем запросе слияния.Мое решение неверно?