Dot-Net

如何確定 SQL Server 儲存過程參數是否具有預設值?

  • May 23, 2020

有沒有辦法以程式方式確定 SQL Server 儲存過程參數是否具有預設值?(如果您可以確定預設值,則可以加分。) SqlCommandBuilder.DeriveParameters()甚至沒有嘗試。

在此先感謝您的幫助!

編輯:老實說,我不在乎它是 SQL 查詢、SMO 對像等。

我找到了一種使用 SMO 的方法:

Server srv; 
srv = new Server("ServerName"); 

Database db; 
db = srv.Databases["MyDatabase"]; 

var Params = db.StoredProcedures["MyStoredProc"].Parameters;

foreach(StoredProcedureParameter param in Params) {
   Console.WriteLine(param.Name + "-" + param.DefaultValue);
}

在 SQL Server 2005 及更高版本中沒什麼大不了的:

SELECT 
   pa.NAME, 
   t.name 'Type',
   pa.max_length,
   pa.has_default_value,
   pa.default_value
FROM 
   sys.parameters pa
INNER JOIN 
   sys.procedures pr ON pa.object_id = pr.object_id
INNER JOIN 
   sys.types t ON pa.system_type_id = t.system_type_id
WHERE 
       pr.Name = 'YourStoredProcName'

不幸的是,即使這看起來像小菜一碟 - 它不起作用:-(

來自技術網:

SQL Server僅在此目錄視圖中維護 CLR 對象的預設 **值;**因此, 對於 Transact-SQL 對象,此列的值為 0。要查看 Transact-SQL 對像中參數的預設值,請查詢 sys.sql_modules 目錄視圖的定義列,或使用 OBJECT_DEFINITION 系統函式。

因此,您所能做的就是查詢sys.sql_modules或呼叫SELECT object_definition(object_id)以獲取儲存過程的 SQL 定義(T-SQL 原始碼),然後您需要對其進行解析(**糟透了!!**很長時間…..)

似乎真的沒有其他方法可以做到這一點……我感到驚訝和震驚……

也許在 SQL Server 2008 R2 中?:-) 馬克

引用自:https://stackoverflow.com/questions/1676026