我知道QUOTENAME函数可用于添加方括号(默认行为)或其他一些字符包装。 QUOTENAME不适用于较长的字符串(超过128个字符)。所以我的问题是,为什么/何时使用它而不是更传统,更易读的字符串连接。为什么不只在术语的开头和结尾处连接单引号或方括号,而使用此函数呢?

最佳答案

它是专门为引用列/表/数据库名称(系统名称)而设计的。例如,这:SELECT QUOTENAME('abc[]def')返回[abc[]]def],而SELECT '[' + 'abc[]def' + ']'返回[abc[]def],这无效用作列/表/数据库名称。

此外,SQL-99标准是使用单引号引起来的,并且当前版本的Sql Server继续使用方括号,但将来可能(或可配置)使用SQL-99标准。在这种情况下,所有使用QUOTENAME的代码将继续正常运行,而尝试自行转义的代码将失败。

还有更细微的含义。由于QUOTENAME具有与sysname完全相同的限制,因此Microsoft是否应该决定将sysname更改为长于128个字符(也许是256个?也许是32767个?),因此可以假定QUOTENAME然后也能够处理这些增加的大小。使用QUOTENAME是从可能不受信任的来源中获取列名并将其用作sysname的一种安全方法,无论当前/将来的数据库设置如何,都不必担心输入中的边缘情况(例如]或' ),以及是否允许该字符串突破列名以创建SQL注入攻击。我可能不会仅依靠此功能来获得安全性,而是将其用于许多保护层中。

10-08 09:31