将 nvarchar 值...转换为数据类型 int 时转换失败
Posted
技术标签:
【中文标题】将 nvarchar 值...转换为数据类型 int 时转换失败【英文标题】:Conversion failed when converting the nvarchar value ... to data type int 【发布时间】:2014-02-09 04:04:58 【问题描述】:我创建了下面列出的程序:
CREATE procedure getdata
(
@ID int,
@frm varchar(250),
@to varchar(250)
)
AS
BEGIN
DECLARE @SQL nvarchar(500)
set @SQL = 'select'
set @SQL = @SQL + ' EmpName, Address, Salary from Emp_Tb where 1=1 '
IF (@ID <> '' and @ID is not null)
Begin
SET @sql=@sql+' AND Emp_Id_Pk=' +@ID
End
END
print @sql
--execute (@sql)
我尝试使用:
**execute getdata 3,'','';**
但我收到以下错误:
转换 nvarchar 值时转换失败 'select EmpName, 地址、工资从 Emp_Tb where 1=1 AND Emp_Id_Pk=' 到数据类型 int
请帮忙。
【问题讨论】:
如果你想对带有样式的数据进行转换,也可以使用Convert函数。 【参考方案1】:您正在尝试连接字符串和整数。
您需要将cast@ID
作为字符串。
试试:
SET @sql=@sql+' AND Emp_Id_Pk=' + CAST(@ID AS NVARCHAR(10))
【讨论】:
【参考方案2】:尝试使用
CONVERT(nvarchar(10),@ID)
这类似于演员,但成本较低(就所消耗的时间而言)
【讨论】:
这种说法未经证实——可以根据您自己的数据采取任何一种方式。总结一下answer,CONVERT
是特定于 SQL Server 的,CAST
是 ANSI。建议尽可能使用 CAST。【参考方案3】:
我在我的一个专栏中使用了一个关键字,我用brackets []
解决了这个问题
【讨论】:
如何在我的代码中实现它,你能给我举个例子【参考方案4】:我遇到了同样的问题,我删除了相关列的约束,它对我有用。您可以检查文件夹约束。
捕获:
【讨论】:
【参考方案5】:不要使用字符串连接产生sql,可以使用sp_executesql
系统存储过程来执行带参数的sql语句
create procedure getdata @ID int, @frm varchar(250), @to varchar(250) as
begin
declare @sql nvarchar(max), @paramDefs nvarchar(max);
set nocount on;
set @sql = N'select EmpName, Address, Salary from Emp_Tb where @id is null or Emp_Id_Pk = @id';
set @paramDefs = N'@id int';
execute sp_executesql @sql, @paramDefs, @id = @ID;
end
见sp_executesql
【讨论】:
【参考方案6】:我使用最新版本的 SSMS 或 sql server management studio。我有一个 SQL 脚本(在查询编辑器中),它有大约 100 行代码。这是我在查询中遇到的错误:
Msg 245, Level 16, State 1, Line 2
Conversion failed when converting the nvarchar value 'abcd' to data type int.
解决方案 - 在我忘记将数字(在 varchar 列中)用单引号括起来之前,我曾见过这种错误。
顺便说一句,错误消息具有误导性。查询编辑器中第 70 行的实际错误,而不是错误所说的第 2 行!
【讨论】:
【参考方案7】:您收到此错误是因为您尝试将列 DataType
从 String
转换为 int
,即
leagal if and only if
您在该表中没有该列中包含字符串内容的行
所以只需确保您之前插入的行是compatible with the new changes
【讨论】:
【参考方案8】:当我使用查看 nvarchar 字段但未使用单引号的 where 子句时出现此错误。
我的无效 SQL 查询如下所示:
SELECT * FROM RandomTable WHERE Id IN (SELECT Id FROM RandomTable WHERE [Number] = 13028533)
这不起作用,因为 Number 列的数据类型为 nvarchar。这不是我最初想的 int。
我改成:
SELECT * FROM RandomTable WHERE Id IN (SELECT Id FROM RandomTable WHERE [Number] = '13028533')
它奏效了。
【讨论】:
以上是关于将 nvarchar 值...转换为数据类型 int 时转换失败的主要内容,如果未能解决你的问题,请参考以下文章
SQL 异常:将 nvarchar 值“[anyvalue]”转换为数据类型 int 时转换失败
org.hibernate.exception.SQLGrammarException:将 nvarchar 值“ViewWebApp”转换为数据类型 int 时转换失败