当前位置: 首页 > 面试题库 >

如何将INT数据库字段与VARCHAR类型进行比较

李明贤
2023-03-14
问题内容

我有以下存储过程,没有编写完整的存储过程,但其中一些是:

@course int = null,
    SET @query = @query + 'Where course_id='+ cast(@course as varchar)

我想知道何时我将@course转换为VARCHAR类型,而course_id数据库中的我是INT类型-比较如何进行?


问题答案:

在SQL Server中,两种不同类型之间的比较是这样进行的:

  • 首先,根据数据类型优先级的规则比较这两种类型的优先级:

优先级较低的数据类型将转换为优先级较高的数据类型

  • 接下来,将优先级较低的类型强制转换为优先级较高的类型

  • 然后在优先级较高的类型的原始值和优先级较低的类型的转换后的值之间进行比较

为了便于讨论:将INT(优先级16,高)和a VARCHAR(优先级27,低)进行比较,方法是将VARCHARto强制转换为to
INT,然后将两者进行比较。

在您的情况下,虽然没有发生任何转换,因为发生的情况是该@course值被附加到了动态构造的上@sql。不用说,那是不好的。正确的解决方案是将@courseas作为参数传递给动态SQL调用:

@course INT = null
...
 SET @query = @query + 'Where course_id= @course';
...
exec sp_executesql @sql, '@course int', @course;

这是:

  • 更快 :参数化查询,而不是硬编码值
  • 更安全 :如果代码经过重构并且@counter成为可进行SQL注入的类型,则降低SQL注入的风险
  • 较少出错 :没有NULL值传播使整个结果无效的风险@sql


 类似资料:
  • 问题内容: 我正在尝试使用存储过程基于varchar类型的“名称”列的输入值来返回“项目”表的“ ItemId”列值,但是每当我将任何值传递给存储过程时,它都会向我返回错误: 将数据类型varchar转换为int时出错。 这就是我所说的: 问题答案: 您必须匹配参数:RETURN不会填充OUTPUT参数:您对@itemid的赋值可以做到这一点。 另外,您存储的过程太复杂了。对于从存储的proc返回

  • 我有一个Java8/Maven/Spring Boot项目。我使用Javers来审核应用程序中的更改,然而,我创建了一个自定义注释,它放在类中的字段上方,如果更改,我希望对其进行审核。下面是一个示例类:

  • 我有一个本地数据库,一个登录页面和一个servlet。我可以从数据库中获得我想要的值,例如用户名和密码。我还可以在html登录表单中获得用户输入。我对HTML使用Request.GetParameter。我想检查数据库中的用户名是否等于输入的用户名,以及数据库中的密码是否等于输入的密码,否则访问被拒绝。这是我的代码:

  • 问题内容: 我有一个美国所有州的枚举列表,如下所示: 在测试文件中,我将从包含状态的文本文件中读取输入。由于它们是字符串,因此如何将其与枚举列表的值进行比较,以便将值分配给我设置为的变量: 我了解我需要浏览枚举列表。但是,由于值不是字符串类型,如何比较?这就是我盲目输入的内容。我不知道这是否正确。 问题答案: 试试这个 您可能要处理IllegalArgumentException,如果“ s”值与

  • 有这样的错误: [42000][257]从数据类型“NUMERIC”到“VARCHAR”的隐式转换 [42000][257]从数据类型“INT”到“VARCHAR”的隐式转换是

  • 我正试图将数据从SQL Server同步到Dynamics CRM。 我用C#创建了一个解决方案/项目。在同步CRM的一个帐户实体时,所有的详细信息,如姓名、帐号、发货日期、电话号码所有这类详细信息都是成功同步的,因为表单SQL中的数据类型是或,而在CRM中是单行文本。 但是,当我从到CRM的查找字段执行相同的同步时,它不起作用,并出现异常。 这里,account是CRM中实体的名称,SalesC