簡體   English   中英

如何取消存儲過程中SELECT語句返回的記錄集

[英]How to suppress record sets returned by SELECT statements in a Stored Procedure

我正在寫一個存儲過程,該過程檢查各種數據庫中各種表的存在以及執行存儲過程的用戶對這些表的權限。 存儲過程本身位於用戶數據庫內(即不在主數據庫中)。

為了執行檢查,我的存儲過程包含許多SELECT語句。 這些顯然都返回一個記錄集。 我想要以某種方式抑制這些記錄集,以便它們不由存儲過程返回,而是返回我自己的單個記錄集,它只是與存儲過程執行的每項檢查相關的消息的集合。

我認為顯而易見的答案是改用表值函數,但是由於它們出現在存儲過程中,因此我無法在Function中成功重新創建測試。 對於初學者,我不得不使用臨時表(在函數中是不可能的)和動態SQL(與表參數不太兼容)。

我想我基本上有兩種選擇:

  • 將我的存儲過程重寫為一個函數,並弄清楚如何以另一種方式進行檢查。
  • 繼續使用我的存儲過程,並使用OUTPUT參數返回我的結果消息(可能是分隔字符串),並且在關聯的ASP.NET應用程序中,只需忽略存儲過程返回的所有記錄集即可。

這些解決方案都不能令人滿意。 在我花更多的時間追求任何一個記錄之前,是否有辦法丟棄存儲過程中SELECT語句產生的記錄集,並明確定義我希望它返回的記錄?

嗯,我只能在這里推測...

你在用類似的東西嗎

SELECT ...;
IF @@rowcount > 0
BEGIN
  ...
END;

然后,您可以使用類似

IF EXISTS (SELECT ...)
BEGIN
  ...
END;

要么

DECLARE @variable integer;
SELECT @variable = count(*) ...;
IF @variable > 0
BEGIN
  ...
END;

通常,將查詢結果指向目標(變量,表,表達式等),然后就不會輸出它們。

最后,只需對所需的結果執行查詢即可。

我認為,幾乎沒有理由讓存儲過程生成記錄集。 那就是存儲函數的目的。 有時由於使用動態SQL或其他存儲過程而需要它,但並非一般做法。 我經常看到存儲過程在存儲功能或視圖更合適的地方使用。

你該怎么辦? 甚至存儲過程中的SELECT語句也應該是以下之一:

  • 設置(本地)變量。
  • 將結果保存在臨時表或表變量中。

存儲過程的邏輯應在局部變量上工作。 應使用OUTPUT參數返回結果。

如果需要以表格格式返回行,則可以顯式使用表(例如全局臨時表或實表)來執行此操作。 或者,您可以在最后有一個SELECT並返回單個結果集。 但是,如果您需要此功能並且可以將存儲過程作為函數使用,我認為這更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM