当将 nvarchar 值转换为 int 数据类型时,转换失败。

41

我创建了以下列出的过程:

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, Address, Salary from Emp_Tb where 1=1 AND Emp_Id_Pk=”转换为数据类型 int 时失败。

请帮忙解决。


1
如果您想以特定格式转换数据,也可以使用Convert函数。 - Banketeshvar Narayan
9个回答

81
您正在尝试将一个字符串和一个整数拼接。
您需要将@ID强制转换为字符串类型,请参考这里
请尝试:
SET @sql=@sql+' AND Emp_Id_Pk=' + CAST(@ID AS NVARCHAR(10))

10

尝试使用

CONVERT(nvarchar(10),@ID)

这类似于类型转换,但更省时间。


1
这个说法没有证据支持 -- 取决于你自己的数据,可以有不同的看法。总结一下这个答案CONVERT是SQL Server特定的,而CAST是ANSI标准的。建议尽可能使用CAST - sonyisda1

2

我在一个列中使用了一个关键词,我用[]括起来解决了它。


我该如何在我的代码中实现它,你能给我一个例子吗? - Abd Abughazaleh

2

我使用最新版本的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行!

2
不要使用字符串拼接来生成 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


1
当我使用一个where子句查看nvarchar字段但没有使用单引号时,出现了这个错误。
我的无效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')

它运行成功了。


0

你必须使用 CONCAT,而不是 +

SET @sql = CONCAT(@sql,' AND Emp_Id_Pk=' ,@ID )

0

我曾经遇到过同样的问题,我删除了相关列的约束条件,这对我起作用了。您可以检查文件夹中的约束条件。

捕获:

enter image description here


0
你收到了这个错误,因为你试图将列DataTypeString转换为int,这只有在该表中没有带字符串内容的行时才是合法的。
因此,请确保你之前插入的行与新更改兼容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接