2013-06-11 33 views
1

有沒有在SQL Server目錄視圖,這將使你像select name from sys.procedures的存儲過程,也將告訴你每道工序多少參數接受一個列表什麼? Intellisense會帶你參數的名稱,Visual Studio也會知道。有沒有更好的方法來獲取存儲過程的結果以及每個過程所需參數的數量(和/或名稱)?編程方式確定有多少參數在存儲過程中

我想一個能做到這一點是他們解析sp_helptext的「sprocName」,但我認爲有一個更好的辦法做到這一點。

挖多一點挖想出了

;with x 
as 
(
SELECT 
    p.name AS Parameter,   
    t.name AS [Type], 
    sp.name 
FROM sys.procedures sp 
JOIN sys.parameters p 
    ON sp.object_id = p.object_id 
JOIN sys.types t 
    ON p.system_type_id = t.system_type_id 
) 
select name,Parameter,COUNT(*) 
from x 
group by name,Parameter 

which'll做的工作。

+0

您是否試圖從.NET語言(您提到Visual Studio)或直接在TSQL內部執行此操作? –

+0

@YuriyGalanter在Visual Studio裏面怎麼樣,因爲我發現了一個TSQL soltuion(並且你不能只是製作一個上面TSQL的存儲過程:)) – wootscootinboogie

+0

還有一個更好的方法,請看下面的答案 –

回答

2

您可以在參數信息得到像這樣:

declare @ProcedureName sysname; 
set @ProcedureName = '[dbo].[YourProcedureName]'; 

select sp.name, 
     spa.name, 
     spa.is_output 
from sys.procedures sp 
join sys.parameters spa on 
     sp.object_id = spa.object_id 
where sp.object_id = object_id(@ProcedureName); 
+0

只是好奇,你爲什麼創建該變量,而不是隻是使Where子句,其中'sp.name ='x'' – wootscootinboogie

+0

只是習慣,我想,如果你會從DAL調用等。使用'object_id'允許你傳遞一個DatabaseId作爲以及名稱解析的架構。 –

+0

啊,整齊。我必須在我的工具箱中將其存檔。 – wootscootinboogie

3

試試這個:

select * from information_schema.parameters 
where specific_name='your_procedure_name' 
2

如果真如你所說,你使用.NET語言爲此,您可以使用SqlCommandBuilder的DeriveParameters方法。這樣你就不必在後端編寫任何東西,只需在.NET代碼中完成。

+0

.NET新手,並沒有聽說過這個,謝謝。 – wootscootinboogie

0

還有一些有趣的程序,由微軟提供。您可以從中選擇正確的數據。另請參見System Stored Procedures

SET QUOTED_IDENTIFIER ON 
SET ANSI_NULLS ON 
GO 

create procedure sys.sp_sproc_columns_90 
(
    @procedure_name   nvarchar(390) = '%', 
    @procedure_owner  nvarchar(384) = null, 
    @procedure_qualifier sysname = null, 
    @column_name   nvarchar(384) = null, 
    @ODBCVer    int = 2, 
    @fUsePattern   bit = 1 -- To allow users to explicitly disable all pattern matching. 
) 
as 
    declare @group_num_lower smallint 
    declare @group_num_upper smallint 
    declare @semi_position int 
    declare @full_procedure_name nvarchar(775) -- 390 + 1 + 384 
    declare @procedure_id int 

    if @procedure_qualifier is not null 
    begin 
     if db_name() <> @procedure_qualifier 
     begin 
      if @procedure_qualifier = '' 
      begin 
       -- in this case, we need to return an empty result set 
       -- because the user has requested a database with an empty name 
       select @procedure_name = '' 
       select @procedure_owner = '' 
      end 
      else 
      begin -- If qualifier doesn't match current database 
       raiserror (15250, -1,-1) 
       return 
      end 
     end 
    end 

    if @procedure_name is null 
    begin -- If procedure name not supplied, match all 
     select @procedure_name = '%' 
    end 

    -- first we need to extract the procedure group number, if one exists 
    select @semi_position = charindex(';',@procedure_name) 
    if (@semi_position > 0) 
    begin -- If group number separator (;) found 
     select @group_num_lower = convert(int,substring(@procedure_name, @semi_position + 1, 2)) 
     select @group_num_upper = @group_num_lower 
     select @procedure_name = substring(@procedure_name, 1, @semi_position -1) 
    end 
    else 
    begin -- No group separator, so default to all groups 
     select @group_num_lower = 0 
     select @group_num_upper = 32767   
    end 

    if @procedure_owner is null 
    begin -- If unqualified procedure name 
     select @full_procedure_name = quotename(@procedure_name) 
    end 
    else 
    begin -- Qualified procedure name 
     if @procedure_owner = '' 
     begin -- If empty owner name 
      select @full_procedure_name = quotename(@procedure_owner) 
     end 
     else 
     begin 
      select @full_procedure_name = quotename(@procedure_owner) + '.' + quotename(@procedure_name) 
     end 
    end 

    select @procedure_id = object_id(@full_procedure_name) 


    if (@fUsePattern = 1) -- Does the user want it? 
    begin 
     if ((isnull(charindex('%', @full_procedure_name),0) = 0) and 
      (isnull(charindex('[', @procedure_name),0) = 0) and 
      (isnull(charindex('[', @procedure_owner),0) = 0) and 
      (isnull(charindex('_', @full_procedure_name),0) = 0) and 
      (@procedure_id is not null)) 
     begin 
      select @fUsePattern = 0 -- not a single wild char, so go the fast way. 
     end 
    end 

    if @fUsePattern = 0 
    begin 
     /* -- Debug output, do not remove it. 
     print '*************' 
     print 'No pattern matching.' 
     print isnull(convert(sysname, @procedure_id), '@procedure_id = null') 
     print isnull(@full_procedure_name,    '@full_procedure_name = null') 
     print isnull(@procedure_name,     '@procedure_name = null') 
     print isnull(@procedure_owner,     '@procedure_owner = null') 
     print isnull(@procedure_qualifier,    '@procedure_qualifier = null') 
     print isnull(@column_name,      '@column_name = null') 
     print isnull(@ODBCVer,       '@ODBCVer = null') 
     print '*************' 
     */ 

     -- 
     -- FAST! 
     -- 
     select 
      PROCEDURE_QUALIFIER   = s_scov.PROCEDURE_QUALIFIER, 
      PROCEDURE_OWNER    = s_scov.PROCEDURE_OWNER, 
      PROCEDURE_NAME    = convert(nvarchar(134), 
              s_scov.PROCEDURE_NAME +';'+ ltrim(str(s_scov.procedure_number,5))), 
      COLUMN_NAME     = s_scov.COLUMN_NAME, 
      COLUMN_TYPE     = s_scov.COLUMN_TYPE, 
      DATA_TYPE     = s_scov.DATA_TYPE, 
      TYPE_NAME     = s_scov.TYPE_NAME, 
      "PRECISION"     = s_scov.PRECISION, 
      "LENGTH"     = s_scov.LENGTH, 
      SCALE      = s_scov.SCALE, 
      RADIX      = s_scov.RADIX, 
      NULLABLE     = s_scov.NULLABLE, 
      REMARKS      = s_scov.REMARKS, 
      COLUMN_DEF     = s_scov.COLUMN_DEF, 
      SQL_DATA_TYPE    = s_scov.SQL_DATA_TYPE, 
      SQL_DATETIME_SUB   = s_scov.SQL_DATETIME_SUB, 
      CHAR_OCTET_LENGTH   = s_scov.CHAR_OCTET_LENGTH, 
      ORDINAL_POSITION   = s_scov.ORDINAL_POSITION, 
      IS_NULLABLE     = s_scov.IS_NULLABLE, 
      SS_UDT_CATALOG_NAME     = s_scov.SS_UDT_CATALOG_NAME, 
      SS_UDT_SCHEMA_NAME     = s_scov.SS_UDT_SCHEMA_NAME, 
      SS_UDT_ASSEMBLY_TYPE_NAME   = s_scov.SS_UDT_ASSEMBLY_TYPE_NAME, 
      SS_XML_SCHEMACOLLECTION_CATALOG_NAME = s_scov.SS_XML_SCHEMACOLLECTION_CATALOG_NAME, 
      SS_XML_SCHEMACOLLECTION_SCHEMA_NAME = s_scov.SS_XML_SCHEMACOLLECTION_SCHEMA_NAME, 
      SS_XML_SCHEMACOLLECTION_NAME   = s_scov.SS_XML_SCHEMACOLLECTION_NAME, 
      SS_DATA_TYPE    = s_scov.SS_DATA_TYPE 
     from 
      sys.spt_sproc_columns_odbc_view s_scov 
     where 
      s_scov.object_id = @procedure_id and 
      s_scov.odbcver = @ODBCVer and 
      (@column_name is null or s_scov.COLUMN_NAME = @column_name) and 
      (s_scov.procedure_number between @group_num_lower and @group_num_upper) 

     UNION ALL 

     select   -- procedure return value & table valued functions 
      PROCEDURE_QUALIFIER   = s_scrvov.PROCEDURE_QUALIFIER, 
      PROCEDURE_OWNER    = s_scrvov.PROCEDURE_OWNER, 
      PROCEDURE_NAME    = convert(nvarchar(134), 
              s_scrvov.PROCEDURE_NAME +';'+ ltrim(str(s_scrvov.procedure_number,5))), 
      COLUMN_NAME     = s_scrvov.COLUMN_NAME, 
      COLUMN_TYPE     = s_scrvov.COLUMN_TYPE, 
      DATA_TYPE     = s_scrvov.DATA_TYPE, 
      TYPE_NAME     = s_scrvov.TYPE_NAME, 
      "PRECISION"     = s_scrvov.PRECISION, 
      "LENGTH"     = s_scrvov.LENGTH, 
      SCALE      = s_scrvov.SCALE, 
      RADIX      = s_scrvov.RADIX, 
      NULLABLE     = s_scrvov.NULLABLE, 
      REMARKS      = s_scrvov.REMARKS, 
      COLUMN_DEF     = s_scrvov.COLUMN_DEF, 
      SQL_DATA_TYPE    = s_scrvov.SQL_DATA_TYPE, 
      SQL_DATETIME_SUB   = s_scrvov.SQL_DATETIME_SUB, 
      CHAR_OCTET_LENGTH   = s_scrvov.CHAR_OCTET_LENGTH, 
      ORDINAL_POSITION   = s_scrvov.ORDINAL_POSITION, 
      IS_NULLABLE     = s_scrvov.IS_NULLABLE, 
      SS_UDT_CATALOG_NAME     = s_scrvov.SS_UDT_CATALOG_NAME, 
      SS_UDT_SCHEMA_NAME     = s_scrvov.SS_UDT_SCHEMA_NAME, 
      SS_UDT_ASSEMBLY_TYPE_NAME   = s_scrvov.SS_UDT_ASSEMBLY_TYPE_NAME, 
      SS_XML_SCHEMACOLLECTION_CATALOG_NAME = s_scrvov.SS_XML_SCHEMACOLLECTION_CATALOG_NAME, 
      SS_XML_SCHEMACOLLECTION_SCHEMA_NAME = s_scrvov.SS_XML_SCHEMACOLLECTION_SCHEMA_NAME, 
      SS_XML_SCHEMACOLLECTION_NAME   = s_scrvov.SS_XML_SCHEMACOLLECTION_NAME, 
      SS_DATA_TYPE    = s_scrvov.SS_DATA_TYPE 
     from 
      sys.spt_sproc_columns_return_values_odbc_view s_scrvov 
     where 
      s_scrvov.object_id = @procedure_id and 
      (
       @column_name is null or 
       @column_name = '@RETURN_VALUE' or 
       @column_name = '@TABLE_RETURN_VALUE' 
      ) and 
      (s_scrvov.procedure_number between @group_num_lower and @group_num_upper) 

     order by 1, 2, 3, 18 
    end 
    else 
    begin 
     /* -- Debug output, do not remove it. 
     print '*************' 
     print 'THERE IS pattern matching!' 
     print isnull(convert(sysname, @procedure_id), '@procedure_id = null') 
     print isnull(@full_procedure_name,    '@full_procedure_name = null') 
     print isnull(@procedure_name,     '@procedure_name = null') 
     print isnull(@procedure_owner,     '@procedure_owner = null') 
     print isnull(@procedure_qualifier,    '@procedure_qualifier = null') 
     print isnull(@column_name,      '@column_name = null') 
     print isnull(@ODBCVer,       '@ODBCVer = null') 
     print '*************' 
     */ 

     -- 
     -- SLOOOOOW! 
     -- 
     if @procedure_owner is null 
      select @procedure_owner = '%' 

     select 
      PROCEDURE_QUALIFIER   = s_scov.PROCEDURE_QUALIFIER, 
      PROCEDURE_OWNER    = s_scov.PROCEDURE_OWNER, 
      PROCEDURE_NAME    = convert(nvarchar(134), 
              s_scov.PROCEDURE_NAME +';'+ ltrim(str(s_scov.procedure_number,5))), 
      COLUMN_NAME     = s_scov.COLUMN_NAME, 
      COLUMN_TYPE     = s_scov.COLUMN_TYPE, 
      DATA_TYPE     = s_scov.DATA_TYPE, 
      TYPE_NAME     = s_scov.TYPE_NAME, 
      "PRECISION"     = s_scov.PRECISION, 
      "LENGTH"     = s_scov.LENGTH, 
      SCALE      = s_scov.SCALE, 
      RADIX      = s_scov.RADIX, 
      NULLABLE     = s_scov.NULLABLE, 
      REMARKS      = s_scov.REMARKS, 
      COLUMN_DEF     = s_scov.COLUMN_DEF, 
      SQL_DATA_TYPE    = s_scov.SQL_DATA_TYPE, 
      SQL_DATETIME_SUB   = s_scov.SQL_DATETIME_SUB, 
      CHAR_OCTET_LENGTH   = s_scov.CHAR_OCTET_LENGTH, 
      ORDINAL_POSITION   = s_scov.ORDINAL_POSITION, 
      IS_NULLABLE     = s_scov.IS_NULLABLE, 
      SS_UDT_CATALOG_NAME     = s_scov.SS_UDT_CATALOG_NAME, 
      SS_UDT_SCHEMA_NAME     = s_scov.SS_UDT_SCHEMA_NAME, 
      SS_UDT_ASSEMBLY_TYPE_NAME   = s_scov.SS_UDT_ASSEMBLY_TYPE_NAME, 
      SS_XML_SCHEMACOLLECTION_CATALOG_NAME = s_scov.SS_XML_SCHEMACOLLECTION_CATALOG_NAME, 
      SS_XML_SCHEMACOLLECTION_SCHEMA_NAME = s_scov.SS_XML_SCHEMACOLLECTION_SCHEMA_NAME, 
      SS_XML_SCHEMACOLLECTION_NAME   = s_scov.SS_XML_SCHEMACOLLECTION_NAME, 
      SS_DATA_TYPE    = s_scov.SS_DATA_TYPE 
     from 
      sys.spt_sproc_columns_odbc_view s_scov 
     where 
      s_scov.PROCEDURE_NAME like @procedure_name and 
      (@column_name is null or s_scov.COLUMN_NAME like @column_name) and 
      s_scov.odbcver = @ODBCVer and 
      (s_scov.procedure_number between @group_num_lower and @group_num_upper) and 
      schema_name(s_scov.schema_id) like @procedure_owner 

     UNION ALL 

     select   -- procedure return value & table valued functions 
      PROCEDURE_QUALIFIER   = s_scrvov.PROCEDURE_QUALIFIER, 
      PROCEDURE_OWNER    = s_scrvov.PROCEDURE_OWNER, 
      PROCEDURE_NAME    = convert(nvarchar(134), 
              s_scrvov.PROCEDURE_NAME +';'+ ltrim(str(s_scrvov.procedure_number,5))), 
      COLUMN_NAME     = s_scrvov.COLUMN_NAME, 
      COLUMN_TYPE     = s_scrvov.COLUMN_TYPE, 
      DATA_TYPE     = s_scrvov.DATA_TYPE, 
      TYPE_NAME     = s_scrvov.TYPE_NAME, 
      "PRECISION"     = s_scrvov.PRECISION, 
      "LENGTH"     = s_scrvov.LENGTH, 
      SCALE      = s_scrvov.SCALE, 
      RADIX      = s_scrvov.RADIX, 
      NULLABLE     = s_scrvov.NULLABLE, 
      REMARKS      = s_scrvov.REMARKS, 
      COLUMN_DEF     = s_scrvov.COLUMN_DEF, 
      SQL_DATA_TYPE    = s_scrvov.SQL_DATA_TYPE, 
      SQL_DATETIME_SUB   = s_scrvov.SQL_DATETIME_SUB, 
      CHAR_OCTET_LENGTH   = s_scrvov.CHAR_OCTET_LENGTH, 
      ORDINAL_POSITION   = s_scrvov.ORDINAL_POSITION, 
      IS_NULLABLE     = s_scrvov.IS_NULLABLE, 
      SS_UDT_CATALOG_NAME     = s_scrvov.SS_UDT_CATALOG_NAME, 
      SS_UDT_SCHEMA_NAME     = s_scrvov.SS_UDT_SCHEMA_NAME, 
      SS_UDT_ASSEMBLY_TYPE_NAME   = s_scrvov.SS_UDT_ASSEMBLY_TYPE_NAME, 
      SS_XML_SCHEMACOLLECTION_CATALOG_NAME = s_scrvov.SS_XML_SCHEMACOLLECTION_CATALOG_NAME, 
      SS_XML_SCHEMACOLLECTION_SCHEMA_NAME = s_scrvov.SS_XML_SCHEMACOLLECTION_SCHEMA_NAME, 
      SS_XML_SCHEMACOLLECTION_NAME   = s_scrvov.SS_XML_SCHEMACOLLECTION_NAME, 
      SS_DATA_TYPE    = s_scrvov.SS_DATA_TYPE 
     from 
      sys.spt_sproc_columns_return_values_odbc_view s_scrvov 
     where 
      s_scrvov.PROCEDURE_NAME like @procedure_name and 
      schema_name(s_scrvov.schema_id) like @procedure_owner and 
      (
       @column_name is null or 
       @column_name = '@RETURN_VALUE' or 
       @column_name = '@TABLE_RETURN_VALUE' 
      ) and 
      (s_scrvov.procedure_number between @group_num_lower and @group_num_upper) 

     order by 1, 2, 3, 18 
    end 

GO