【问题标题】:How to extract table name into string variable如何将表名提取到字符串变量中
【发布时间】: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


【解决方案1】:

我有一个想法,你可以将你的表名记录存储到一个临时表中,并添加一个标识列,当你使用动态 sql 作为表名时,你可以使用

DECLARE @SQL VARCHAR(MAX)
DECLARE @Count INT = 1
DECLARE @Table VARCHAR(20)
DECLARE @Column VARCHAR(20)

WHILE @COUNT <= (SELECT COUNT(*) FROM #temp) 
BEGIN
    select @table = TABLENAME FROM #temp WHERE id = @Count
    SELECT @Column = COLUMNNAME FROM #temp WHERE id = @Count

    SELECT @sql = 'Alter table '+ @table+' Add +' @column

PRINT @SQL

SET @Count = @Count + 1

我总是先用print看结果是否正确,然后改用exec

如果你喜欢我的回答,请投票,谢谢。

【讨论】:

  • 高嘉诚,非常感谢您的想法。我理解正确吗,我们应该创建一个带有表名的字典,它是 id。每次我们使用动态 sql 查询时,我们都会从字典中获取一个表名。因此,我们只需要更新一次表名,而不是在所有过程中。
  • 没错,如果你想更新很多不同列名的表,这样可以确保一个一个地遍历所有表。
  • 高嘉诚,你的建议对我来说似乎是最好的。坦率地说,更改列名对我来说不是必需的。只有表。我听说,还有另一种方法,它根本不需要重命名表名:1)创建故事过程 2)让这个过程执行唯一的查询:select top 1 * from table_name 3)通过一些内置的- 在 SSMS 中查看程序使用的表名 4) 删除程序。可能有人听说过。
猜你喜欢
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多