为什么我的 sql 命令不接受 table 名称的带引号的标识符?

Why isn't my sql command accepting a quoted identifier for a table name?

我想进行 sql 查询 防弹 并发现 this 关于清理 table/column 名称的问题。

我听从了建议,但不知何故它没有按预期工作。

我的 table 名字是 foo.Bar 所以我把它传给了 CommandBuilderQuoteIdentifier 方法,它给了我 [foo.Bar] 回来。

当我调用 (string)cmd.ExecuteScalar(); 时,它抱怨说 table 不存在。因此,我尝试将 table 名称最初定义为 [foo].[Bar]。在这种情况下 QuoteIdentifier 创建 [[foo]].[Bar]]] 这也不起作用。

唯一可行的是当我只指定 [foo].[Bar] 而不使用 QuoteIdentifier 方法时。

此时我想知道是否可以使用它来保护我的查询?它没有多大用处,并且像 another answer 这样调整引用的查询建议似乎也不正确。

我能做些什么来保护查询并使其正常工作并在不破坏它的情况下接受名称 [foo].[Bar]

这就是我创建查询的方式:

cmd.CommandText = string.Format(
    "SELECT {0} FROM {1} WHERE {2} = '{3}'{4}",
    ...,
    sanitizedTableName, // only [foo].[Bar] works -- [[foo]].[Bar]]] and [foo.Bar] fail
    ...,
    ...,
    ...);

问题是 table 的名称是 bar,而不是 foo.bar。您正在使用 multi-part 标识符 - foo 是架构,bar 是 table 名称。

要获得正确的引用,您需要分别引用每个标识符:

QuoteIdentifier(schemaName) + "." + QuoteIdentifier(tableName)

这样做的原因应该很明显 - 引用标识符使用 . 作为名称的一部分是完全有效的。这就是首先引用的全部意义所在。