幂等的QUOTENAME()?

时间:2018-03-05 17:22:54

标签: tsql

在构建动态sql以处理名称中的“特殊”charatcers时,常常使用tsql中的QUOTENAME()函数。如果通过嵌套代码结束冗余调用,它就会崩溃。

declare @name sysname = 'simple_name'
print '@name:    ' + @name
print 'QUOTENAME(@name):        ' + QUOTENAME(@name)
print 'QUOTENAME(QUOTENAME(@name)): ' + QUOTENAME(QUOTENAME(@name))

结果

  

@name:simple_name   QUOTENAME(@name):[simple_name]   QUOTENAME(QUOTENAME(@ name)):[[simple_name]]]

除了确保在代码库中不可能进行这种链式调用之外,任何人的幂等版本都是安全的,即使对于嵌套调用也是如此?

1 个答案:

答案 0 :(得分:0)

我不太了解正则表达式,但我想你可以在exec之前做一些@sql scrub。

我确定某种正则表达式会更快,但这是我的考验。

DECLARE @name sysname = 'simple_name'
DECLARE @SQLTest nvarchar(max)

SET @SQLTest = 'select QUOTENAME(QUOTENAME(@name)), ''blah'', ''blah'''

SET @SQLTest = Replace(@SQLTest, Substring(@SQLTest, PatIndex('%QUOTENAME(QUOTENAME(%))%', @SQLTest), 20), 'QUOTENAME(')


SET @SQLTest = Replace(@SQLTest, Substring(@SQLTest, PatIndex('%))%', @SQLTest), 2), ')')

---这可能是更安全的第二次替换?

SET @SQLTest = Replace(@SQLTest, Substring(reverse(@SQLTest), PatIndex('%))%EMANETOUQ%', reverse(@SQLTest)), 2), ')')

-

select @SQLTest

exec sp_executesql @SQLTest, N'@name sysname', @name