`QUOTED_IDENTIFIERS` 究竟是做什么的?

Eva*_*oll -5 sql-server linux configuration

SQL Server 中有一个非常令人讨厌的功能QUOTED_IDENTIFIERS,我想了解更多。简而言之,将选项设置为ON,这不是 Linux 客户端的默认设置,一切正常。没有它,有些事情会神奇地失败。Microsoft 声称该选项是DEFAULT,然后他们在自己的默认客户端中默认更改它。随着SET QUOTED_IDENTIFIERS OFF;,这有效,

CREATE TABLE f (
  a int,
  b int,
  g AS (CASE WHEN a>b THEN a ELSE b END),
  l AS (CASE WHEN a>b THEN b ELSE a END),
  UNIQUE(a,b)
);
Run Code Online (Sandbox Code Playgroud)

有了SET QUOTED_IDENTIFIERS OFF;,这并不能正常工作,

CREATE TABLE f (
  a int,
  b int,
  g AS (CASE WHEN a>b THEN a ELSE b END),
  l AS (CASE WHEN a>b THEN b ELSE a END),
  UNIQUE(g,l)
);
Run Code Online (Sandbox Code Playgroud)

我只是想知道如何g以及比andl更像是一个标识符,以及如何不支持这种语法,除非客户端启用是一个好主意或明智的主意?这个选项到底在做什么?ab

我只是问,因为现在我被这个咬了两次,

Dav*_*oft 5

计算列上的索引视图或索引是通过 TSQL 表达式与表行相关的表索引。因此,在更改表时,SQL 必须确定更改是否还需要更改索引视图或计算列上的索引。

为了使这更容易,SQL Server 一直要求特定的 SET 选项对进行更改的会话处于活动状态。在这种情况下,带引号的标识符有助于确定计算列是否受 DML 语句影响,因为表达式“a”将引用列 a,而不是字符串值。

这个要求没有根本原因,但规范化 SET 选项可以使实现更简单,并且符合更广泛的愿望,即在应用程序中促进单一、标准的会话设置集。

SQLCMD 将带引号的标识符默认为 off,要么是为了向后兼容,要么是为了与脚本环境兼容,或者可能没有充分的理由。