在构建动态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]]]
除了确保在代码库中不可能进行这种链式调用之外,任何人的幂等版本都是安全的,即使对于嵌套调用也是如此?
答案 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