Sql-Server

在開始嘗試開始擷取塊中刪除表 - 是否有任何性能損失?

  • June 7, 2017

下面的程式碼是一個動態 sql,它將為您提供系統中所有警報的列表。

有用。

由於這個問題之外的原因,程式碼中有一個臨時表。

這個問題與我在創建臨時表之前確保臨時表不存在的方式有關。

正如您在下面的程式碼中看到的那樣,我在 try catch 塊中放置了一個放置表。

我的問題是:

  • 有沒有性能損失?
  • 這樣做有什麼缺點嗎?
  • 為什麼這通常不被認為是最佳實踐?

我還有一些伺服器 sql-server-2008-r2 但我的伺服器大多是 sql server 2016。

EXEC Sp_executesql 
N'  

begin try
drop table #tmp_sp_help_alert 
end try
begin catch
end catch

create table #tmp_sp_help_alert  (
id int null, name nvarchar(128) null,  
event_source nvarchar(100) null, 
event_category_id int null, 
event_id int null, 
message_id int null,  
severity int null, 
enabled tinyint null, 
delay_between_responses int null, 
last_occurrence_date int null, 
last_occurrence_time int null, 
last_response_date int null, 
last_response_time int null, 
notification_message nvarchar(512) null, 
include_event_description tinyint null, 
database_name nvarchar(128) null, 
event_description_keyword nvarchar(100) null, 
occurrence_count int null, 
count_reset_date int null, 
count_reset_time int null, 
job_id uniqueidentifier null, 
job_name nvarchar(128) null, 
has_notification int null, 
flags int null, 
performance_condition nvarchar(512) null, 
category_name nvarchar(128) null,  
wmi_namespace nvarchar(max) null,  
wmi_query nvarchar(max) null, 
type int null)   

insert into #tmp_sp_help_alert 
exec msdb.dbo.sp_help_alert         



SELECT * FROM #tmp_sp_help_alert AS tsha --WHERE (tsha.name=@_msparam_0)   
--drop   table #tmp_sp_help_alert

', 
   N'@_msparam_0 nvarchar(4000)', 
   @_msparam_0=N'SQLPROD2 Alert - AG Role Change' 

最好檢查表是否存在,而不是嘗試刪除它並忽略任何錯誤。在所有程式語言中,這通常被認為是一種不好的做法。在 SQL Server 和所有 RDBMS 中,您都有元數據,因此肯定有更好的方法來做到這一點。

一個例子:

IF OBJECT_ID('tempdb..#tmp_sp_help_alert') IS NOT NULL
   DROP TABLE #tmp_sp_help_alert;

此外,臨時表在超出範圍時會被自動刪除(對於本地臨時表,當過程結束時),因此測試表是否存在可能是過度的。出於同樣的原因,也可能沒有必要在範圍末尾刪除表。

引用自:https://dba.stackexchange.com/questions/175638