何时/为何在 SQL 中使用 QUOTENAME?

问题描述 投票:0回答:3

我知道

QUOTENAME
函数可用于向字符串添加方括号(
[]
,默认行为)或其他字符包装。它不适用于较长的字符串(超过 128 个字符)。

那么...为什么/什么时候你会使用它而不是更传统且更容易阅读的字符串连接?

为什么不直接在术语的开头和结尾连接单引号或方括号并使用此函数?

sql-server string concatenation quotename
3个回答
36
投票

它是专门为引用列/表/数据库名称 - 系统名称而设计的。 例如,以下内容:

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 是一种从可能不受信任的来源获取列名并将其用作系统名的安全方法 - 无论当前/未来的数据库设置如何,而不必担心边缘情况(例如输入中的 ] 或 ' )以及是否允许字符串突破列名以创建 SQL 注入攻击。 我可能不会仅仅依赖此功能来确保安全,而是将其用于多层保护之一。


9
投票

主要在需要构建动态sql时使用

QUOTENAME()
。动态 SQL 是您应该尽可能避免的,但在极少数情况下,它可能是解决问题的最佳方法。构建动态 SQL 时,
QUOTENAME()
是确保表和列名称标识符(可能包含空格等不需要的字符)不会导致最终 SQL 语句出现问题的正确方法。


2
投票

QuoteName 主要是为 SYSNAME 之类的数据类型设计的。此 sysname 数据类型是 128 个字符的 unicode,即 NVARCHAR(128)。因此,如果超过 128 个字符,则需要使用传统的连接方式。但我们可以对 varchar、nvarchar 和 sysname 数据类型使用 QUOTENAME..

declare @test NVARCHAR(1000) = replicate('a',500)
declare @testsysname sysname = replicate('a',500)

select QUOTENAME(@test) -- this returns null
select QUOTENAME(@testsysname) --this displays only for 128 character with brackets
© www.soinside.com 2019 - 2024. All rights reserved.