【问题标题】:Overcoming the reserved word "IN" in sql server [closed]克服sql server中的保留字“IN”[关闭]
【发布时间】:2013-08-25 11:14:04
【问题描述】:

仅供参考,我使用的是 SQL Azure。

我注意到,当我尝试根据车牌和该车牌的状态从表中选择数据时,如果状态为“IN”,则不会返回任何结果。我意识到“IN”这个词在 SQL Server 中是保留的;但是,我将其包含在查询的引号中。我目前处于测试阶段,表中只有一条记录,其牌照为 287YGB,状态为 IN。

如果我按如下方式编写查询,我将一无所获。

SELECT MakeModel, CitizenID, VehicleID FROM tblVehicles WHERE tblVehicles.Lisence = '287YGB'  AND tblVehicles.PlateState = 'IN'

如果我以这种方式编写查询,我将返回我的结果。但这还不够好。

SELECT MakeModel, CitizenID, VehicleID FROM tblVehicles WHERE tblVehicles.Lisence = '287YGB' 

最后,如果我以这种方式编写查询,我会得到表中唯一的一行。

SELECT MakeModel, CitizenID, VehicleID FROM tblVehicles

从这些测试中,我可以看到最后一个 where 参数导致了问题。我假设这是因为保留了“IN”这个词。有没有办法解决这个问题?

【问题讨论】:

  • 确定数据没有一些前导空格或周围其他不可见字符?搜索'IN'没有问题
  • 如果包含在引号中 - 你不应该遇到这个问题...
  • IN 是保留关键字。 'IN' 是一个字符串。如果值周围有刻度,则它不是保留关键字。
  • 那是巧合。如果您的第一个查询有效,那么您的第二个查询也应该有效,第三个查询也应该有效。
  • SELECT CAST(tblVehicles.PlateState AS VARBINARY(10)) FROM tblVehicles 返回什么?

标签: sql sql-server tsql


【解决方案1】:

保留字通常仅在将它们用作字段名称时才会引起问题,在这种情况下,您需要用括号(“[]”)将它们括起来以消除问题。我几乎可以保证你的 PlateState 里面有一些垃圾,所以你需要先修剪它 (LTRIM(RTRIM(PlateState)) = 'IN') 或者改用 Like '%IN%',这将返回您期望的结果。

【讨论】:

  • 看来你是对的。我的状态列 nvarchar 限制设置为 50。我不喜欢将其限制为低于此值,将其归结为强迫症,因此我决定尝试将其限制为两个字符。一旦我这样做了,我的原始查询就起作用了。现在我想知道那里有什么垃圾,它是从哪里引入的。当我保存车辆并遵循程序中的 PlateState 变量时,我严格输入了“IN”。该字符串始终为“IN”。讨厌这些小怪癖
  • @FreshPrinceOfSO “我的状态列 nvarchar 限制设置为 50。我不喜欢将其限制为低于此值,将其归结为强迫症,因此我决定尝试将其限制为两个字符。 "
  • @Adrian “所以即使你知道你的州首字母缩写词是 2 个字符,你还是坚持不超过 50 个字符的可变长度?”
  • @Adrian 我非常讨厌被称为“兄弟”。你基本上是在说,我想浪费空间,因为我是强迫症。 You could be saving 2 bytes per row, but you're OCD.
【解决方案2】:

试试这个

SELECT MakeModel, CitizenID, VehicleID FROM tblVehicles WHERE tblVehicles.Lisence = '287YGB'  AND LTRIM(RTRIM(tblVehicles.PlateState)) = 'IN'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    相关资源
    最近更新 更多