Sql-Server
在開始嘗試開始擷取塊中刪除表 - 是否有任何性能損失?
下面的程式碼是一個動態 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;
此外,臨時表在超出範圍時會被自動刪除(對於本地臨時表,當過程結束時),因此測試表是否存在可能是過度的。出於同樣的原因,也可能沒有必要在範圍末尾刪除表。