2011-10-14 18 views
4

我知道我可以使用下面的查詢查找所有存儲過程和它們的參數:找到其中的存儲過程的參數可以爲空(可選)

SELECT 
    r.*, p.* 
FROM 
    INFORMATION_SCHEMA.ROUTINES AS r INNER JOIN 
    INFORMATION_SCHEMA.PARAMETERS AS p 
    ON r.SPECIFIC_SCHEMA = p.SPECIFIC_SCHEMA AND r.SPECIFIC_NAME = p.SPECIFIC_NAME 
WHERE  (r.ROUTINE_TYPE = N'PROCEDURE') 

從這個我可以看到(幾乎)有關參數的所有信息,但我不知道如何找到它們中的哪些可以爲空或具有默認值。

有沒有什麼辦法可以找到它?

謝謝

回答

9

所有參數都是可以爲空的。沒有語法來指定不應傳遞NULL

要找出那些有默認值,你可以檢查sys.parameters CLR存儲過程

SELECT has_default_value,name 
FROM sys.parameters 
where object_id=object_id('YourProc') 

不幸的是,T-SQL存儲過程和的唯一途徑此列is not currently populated correctly涉及解析對象定義。

+0

其實參數不可爲空例如在創建過程時,是parametername = null(假設SQL Server) – Grixxly

+0

@Tony只是在默認值爲null的情況下,如果沒有值超出默認值。您可以爲** all **參數傳遞null的顯式值。例子'EXEC('CREATE PROC usp_Foo @ P1 INT AS SELECT SELECT @ P1'); EXEC usp_Foo NULL' –

+0

我糾正了......不知道我在想什麼。 : -/ – Grixxly

1

嘗試此查詢來獲取所有的默認值,爲特定的存儲過程 - 除非你聲明它們

SELECT 
     data3.[object_name] 
    , data3.name 
    , [default_value] = REVERSE(RTRIM(SUBSTRING(
      data3.rtoken 
     , CASE 
      WHEN CHARINDEX(N',', data3.rtoken) > 0 
       THEN CHARINDEX(N',', data3.rtoken) + 1 
      WHEN CHARINDEX(N')', data3.rtoken) > 0 
       THEN CHARINDEX(N')', data3.rtoken) + 1 
      ELSE 1 
      END 
     , LEN(data3.rtoken) 
     ))) 
FROM (
    SELECT 
      data2.name 
     , data2.[object_name] 
     , rtoken = CASE WHEN data2.ptoken LIKE '%=%' 
      THEN REVERSE(SUBSTRING(ptoken 
         , CHARINDEX('=', ptoken, 1) + 1 
         , LEN(data2.ptoken)) 
        ) 
      END 
    FROM (
     SELECT 
       data.name 
      , data.[object_name] 
      , ptoken = SUBSTRING(
        data.tokens 
       , token_pos + name_length + 1 
       , ISNULL(ABS(next_token_pos - token_pos - name_length - 1), LEN(data.tokens)) 
      ) 
     FROM (
      SELECT 
        sm3.tokens 
       , sm3.[object_name] 
       , p.name 
       , name_length = LEN(p.name) 
       , token_pos = CHARINDEX(p.name, sm3.tokens) 
       , next_token_pos = CHARINDEX(p2.name, sm3.tokens) 
      FROM (
       SELECT 
         sm2.[object_id] 
        , sm2.[object_name] 
        , tokens = REVERSE(SUBSTRING(sm2.tokens, ISNULL(CHARINDEX('SA', sm2.tokens) + 2, 0), LEN(sm2.tokens))) 
       FROM (
        SELECT 
          sm.[object_id] 
         , [object_name] = s.name + '.' + o.name 
         , tokens = REVERSE(SUBSTRING(
             sm.[definition] 
            , CHARINDEX(o.name, sm.[definition]) + LEN(o.name) + 1 
            , ABS(CHARINDEX(N'AS', sm.[definition])) 
            ) 
         ) 
        FROM sys.sql_modules sm WITH (NOLOCK) 
        JOIN sys.objects o WITH (NOLOCK) ON sm.[object_id] = o.[object_id] 
        JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id] 
        WHERE o.[type] = 'P ' 
       ) sm2 
       WHERE sm2.tokens LIKE '%=%' 
      ) sm3 
      JOIN sys.parameters p WITH (NOLOCK) ON sm3.[object_id] = p.[object_id] 
      OUTER APPLY (
       SELECT p2.name 
       FROM sys.parameters p2 WITH (NOLOCK) 
       WHERE p2.is_output = 0 
        AND sm3.[object_id] = p2.[object_id] 
        AND p.parameter_id + 1 = p2.parameter_id 
      ) p2 
      WHERE p.is_output = 0 
     ) data 
    ) data2 
) data3 
+1

你能用英語在一般水平上描述這是做什麼的嗎? –

+0

@JoshuaFrank他正在解析存儲過程文本並試圖挑選出默認值。如果我在我的數據庫上運行它,它會返回很多不正確的信息,因此它尚未準備好迎接黃金時段。 –

+0

@SimonHughes:我想的很多,但很難理解具體細節。 –

相關問題