【问题标题】:Create stored procedure to a drop table or refer to table with the parameter [duplicate]为删除表创建存储过程或使用参数[重复]引用表
【发布时间】:2020-07-26 23:07:43
【问题描述】:

我的问题是关于如何在存储过程中引用对象。我想知道这样的事情是否可行:

create proc drop_table @tablename ??
as
drop table @tablename

这样的事情呢?

create or alter proc select_col @col_name nvarchar(50), @table_nbame nvarchar(50)
as
select @col_name
from @table_nbame

我可以创建变量并引用 SP 中的表吗?

【问题讨论】:

  • @DeanOC 我的问题更多是关于如何在存储过程中引用对象...
  • @David 如果你查看链接,这正是它所解释的......如何做你想做的事,这需要动态 SQL。
  • 想要这些类型的通用过程在 T-SQL 中确实被认为是一种反模式。它不仅让您接触到 SQL 注入,而且动态 SQL 更难测试和维护。它不是 T-SQL 的设计目的。
  • @DaleK,好的,因此无法引用对象,例如存储过程中的表。而且我必须从 sys.tables 中获取信息……对吧?
  • 答案是使用sys.tables 来测试给定的表是否存在......你的问题没有提到这一点,但如果这就是你所需要的,那么你就是这样做的。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

在传递参数时不能删除表而不会出错。但是如果您可以将错误重定向到再次检查表是否存在,您可以获得所需的结果:

create procedure drop_table_smartly
    @tablename varchar(20)
as
begin    
    declare @cmd varchar(50) = (select 'drop table '+ @tablename)
    exec (@cmd)
end

所以现在通过使用下面的执行,你可以删除任何表

exec drop_table_smartly 'droper'

请注意,任何其他人警告您的这些都是正确的。你应该只在适当的测试后在生产中使用(不要在生产中使用)

【讨论】:

  • declare @cmd as varchar(50) = 'drop table ' + QuoteName( @tablename ); 就足够了,不需要select。提示:将对象名称组装成动态 SQL 语句时的最佳做法是使用 QuoteName() 以避免出现奇怪名称的问题,例如New Table 带有空格或保留字,例如 From
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 2015-04-28
  • 2011-01-17
  • 2023-03-16
  • 2011-12-16
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多