【问题标题】:Using a bit column in a where clause在 where 子句中使用位列
【发布时间】:2020-12-22 15:38:54
【问题描述】:

我正在编写一个非常简单的查询,我需要根据具有两个值的列检索记录:0 和 1。我没有意识到该列具有位类型,因此当我编写查询 SQL Server正在给我留言

“关键字'Primary'附近的语法不正确。”

我的查询很简单:

select * from [table name]
where Primary = '1'

我已尝试搜索该网站,但找不到好的答案。顺便说一句,我只能从表中检索数据。我不能声明变量或创建存储过程或任何类似的东西。当然,这不可能那么复杂。请帮忙!

【问题讨论】:

  • 我要问一下,您的 SO 用户名是堪萨斯城酋长队的吗?
  • 你不需要引用数字或位。

标签: sql sql-server where-clause


【解决方案1】:

PRIMARY是保留字,需要加引号:

select * from [table name] where [Primary] = 1;

【讨论】:

    【解决方案2】:

    问题与bit 的数据类型无关,错误实际上是在告诉您正是问题是什么:

    关键字“Primary”附近的语法不正确。

    添加了重点。

    PRIMARY 是一个reserved keyword。理想情况下不要对对象名称使用关键字,但如果您“必须”,那么您必须 对对象进行定界标识。事实上,你真的应该避免使用任何需要分隔标识的对象名称:

    SELECT {Your Columns} --Define the columns, don't use *
    FROM dbo.[Table Name] --I hope you don't have white space in your object names too
    WHERE [Primary] = 1; --Don't wrap bit/numerical values in quotes.
    

    【讨论】:

    • 我实际上会写出我将使用的列;这只是快速获取信息的一种快速方法,因此我可以查看所有数据如何驻留在列中。
    【解决方案3】:

    那是因为primarya reserved word in SQL Server。您需要引用它:

    select * from [table name] where [Primary] = 1
    

    我强烈建议更改列名,以免与语言关键字冲突。 SQL Server 中保留的作品少于 200 个,这为替代方案留下了很大的空间。

    所以:

    sp_rename '[table name].[primary]', 'prim', 'COLUMN';
    

    【讨论】:

    • 我没有创建表,也无权更改表和更改结构。不过谢谢!
    • 虽然设计架构的建议很好,但由于一个查询中的查询语法错误而更改数据库结构是非常过分的,尤其是当我们可以轻松转义关键字时。
    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多