sql中的QUOTENAME()函数用于构建动态sql以处理名称中的“特殊”字符。如果通过嵌套代码结束冗余调用,它就会分崩离析。
declare @name sysname = 'simple_name'
print '@name: ' + @name
print 'QUOTENAME(@name): ' + QUOTENAME(@name)
print 'QUOTENAME(QUOTENAME(@name)): ' + QUOTENAME(QUOTENAME(@name))结果
@名称: simple_name QUOTENAME(@name):simple_name QUOTENAME(@name):[simple_name]
除了确保这种链式调用在代码库中是不可能的之外,是否有任何一个幂等式的调用版本即使对于嵌套调用也是安全的?
发布于 2018-03-05 18:29:45
我对regex不太了解,但我可以想象您可以在执行层之前执行某种@sql磨擦。
我确信某种正则表达式会更快,但这是我的测试。
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', @namehttps://stackoverflow.com/questions/49116111
复制相似问题