【发布时间】:2021-01-21 09:23:55
【问题描述】:
您能帮我在 SQL Server 2017 中将表名提取到字符串变量中吗?
问题:
在许多过程中,我都有这样的动态查询:
declare @tbl_name nvarchar(255) = 'm4_results'
if @columns_to_ins is not null
exec ('ALTER TABLE ' + @tbl_name + ' add ' + @columns_to_ins + ';')
通过 Redgate/smart rename 重命名表后,所有“活动”表(在过程中直接提到,如 select * from m4_results)都被重命名。
但是,字符串变量中的表名没有被重命名,因为 SQL Server 不将它们视为表,而是将它们视为字符串。
大量重命名表后,由于没有重命名字符串名称,因此出现许多错误。
我想将表名提取到变量中并在程序中使用,例如declare @tbl_name nvarchar(255) = (query for extract table without using table name as string)
具有此类表名的字典 - 是一种方法,但对我来说不是最佳选择。
【问题讨论】:
-
“在许多程序中,我都有这样的动态查询” 如果它们是这样的,那么每一个都是对注入攻击敞开;您真的需要修复它们并使用
QUOTENAME正确引用您的动态对象。 -
“但是字符串变量中的表名没有被重命名,因为 SQL Server 不将它们视为表,而是将它们视为字符串。” 不确定我是否遵循这里;您给出的示例具有表名称的文字字符串,而不是变量。向我们展示无效的代码,而不是有效的代码。
-
这些只是字符串,而不是表名。 SQL Server 不知道其中的内容。您可以查询存储过程的文本并尝试查找特定的字符串模式,但一般的 SQL 和特别是 T-SQL 在字符串操作方面是糟糕。您至少需要正则表达式,而 T-SQL 中没有。
-
Larnu,Panagiotis Kanavos,感谢您的 cmets。我已经编辑了帖子。另外,我将添加方括号以避免注入攻击。
-
“另外,我将添加方括号以避免注入攻击” 如果您的意思是您这样做
'...[' + @Variable + ']...'无济于事,它仍然很容易注入,正如我解释的here。再次使用QUOTENAME。
标签: sql tsql procedure tablename