将nvarchar值转换为数据类型int时,sql转换失败。 [英] Sql conversion failed when converting the nvarchar value to data type int.

查看:91
本文介绍了将nvarchar值转换为数据类型int时,sql转换失败。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我已经打了好几天了。我正在使用SQL SERVER v17.5



我尝试了很多来自互联网的建议和解决方案,但我似乎无法摆脱这个错误。在我尝试添加Part.Note列(根据新业务要求)之前,此过程一直运行良好。它作为nvarchar(500)存储在源表和我正在使用的每个其他表中。我尝试过COLLATION,CAST,CONVERT,ISNUMERIC(),甚至是单独的更新声明!似乎没什么用。

我在这里结束了我的智慧。有人可以对此有所了解吗?我查看了与CLR相关的内容,并且不确定它是否与MERGE STATEMENT和/或它试图达到的服务器有关。请帮帮忙!



提前谢谢:)



这是我的疑问:=



Hello All,
I have been fighting this for a few days now. I'm using SQL SERVER v17.5

I have tried many suggestions and solutions from across the internet but I can't seem to get rid of this error. This procedure has been running flawlessly until I try to add Part.Note column (as per new business requirement). It is stored as nvarchar(500) in the source table and every other table that I am working with. I have tried COLLATION, CAST, CONVERT, ISNUMERIC(), even a separate update statement! Nothing seems to work.
I am at my wit's end here. Can someone shed a light on this? I looked at something related to CLR's and not sure if it has anything do with the MERGE STATEMENT and/or the server it is trying to reach. Please help!

Thank you in advance :)

This is my query:=

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

我试过:



CONVERT,

CAST,

ISNUMERIC()

UPDATE语句

COLLATIONS,



What I have tried:

I'm using SQL SERVER v17.5
I have tried:

CONVERT,
CAST,
ISNUMERIC()
UPDATE statements
COLLATIONS,

推荐答案

阅读错误信息:

Read the error message:
Sql conversion failed when converting the nvarchar value to data type int.

很明显。

在某个地方大量代码,NVARCHAR值(可能来自列)正在转换为INT - 但它包含的值不是数字(或它的浮点)并且无法转换。这很可能是一个数据问题,我们无法访问您的数据。



所以首先要仔细查看您已紧密汇总的声明:删除

It's pretty clear.
Somewhere in that bulk of code, a NVARCHAR value (probably from a column) is being converted into an INT - but the value it contains is not numeric (or it's floating point) and can't be converted. That's a data problem, most likely, and we don't have any access to your data.

So start by looking at the statement you have assembled closely: remove the

exec sp_executesql @sql

line and replace它带有PRINT语句。仔细看看印刷的内容。弄清楚可能转换的内容及其来源。



我们不能为你做任何事情!

line and replace it with a PRINT statement. Look at what is printed very closely. Work out what might be converted and where it comes from.

We can't do any of that for you!


这篇关于将nvarchar值转换为数据类型int时,sql转换失败。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆