存储过程中的架构

问题描述 投票:0回答:6

我有一个过程,我想阅读该过程的架构。为了检索视图架构,我使用此处显示的查询。我想以同样的方式获取存储过程的架构。如何获得?请显示一些语法。

public static DataTable SchemaReader(string tableName)
{
     string sql = string.Format("Select * from {0}", tableName);
     conn.Open();
     SqlCommand cmd = new SqlCommand(sql, conn);
     cmd.CommandType = CommandType.Text;
     SqlDataReader reader = cmd.ExecuteReader();

     DataTable schema = reader.GetSchemaTable();

     reader.Close();
     conn.Close();
     return schema;
}       

如有任何疑问请询问。提前致谢。

c# sql sql-server-2005 stored-procedures ado.net
6个回答
9
投票

你可以做

public static DataTable SchemaReader(string tableName) 
{      
  string sql = "MySP";//replace this with your store procedure name      
  conn.Open();      
  SqlCommand cmd = new SqlCommand(sql, conn);
  cmd.CommandType = CommandType.StoredProcedure;      
  SqlDataReader reader = cmd.ExecuteReader();       
  DataTable schema = reader.GetSchemaTable();       
  reader.Close();      
  conn.Close();      
  return schema; 
}

希望这有帮助


5
投票

这是一个不会调用 SP 的答案 - 如果这样做,您可能会无意中影响数据

SELECT * FROM sys.dm_exec_describe_first_result_set ('owner.sprocName', NULL, 0) ;

这将返回结果集:

is_hidden
column_ordinal 
name
is_nullable 
system_type_id 
system_type_name    
max_length 
precision 
scale 
collation_name      
user_type_id 
user_type_database  
user_type_schema    
user_type_name      
assembly_qualified_type_name
xml_collection_id 
xml_collection_database
xml_collection_schema  
xml_collection_name    
is_xml_document 
is_case_sensitive 
is_fixed_length_clr_type 
source_server   
source_database 
source_schema   
source_table    
source_column   
is_identity_column 
is_part_of_unique_key 
is_updateable 
is_computed_column 
is_sparse_column_set 
ordinal_in_order_by_list 
order_by_is_descending 
order_by_list_length 
error_number 
error_severity 
error_state 
error_message 
error_type  
error_type_desc

1
投票

您可以获得有关存储过程参数的信息,但是如果不执行它,SQL Server 就无法告诉您存储过程返回的数据集的结构。由于执行存储过程可能会产生副作用,因此 ADO.NET 没有提供方法来告诉您执行存储过程时结果集会是什么样子。此外,结果集可能会根据执行过程时传递给过程的参数而变化。


0
投票

我没有清楚地理解你的问题,我认为这对你有用

Select * 
from sys.objects 
where type='p' and name = (procedure name)

用此替换您的查询,它将正常工作


0
投票

我创建了各种使用存储过程输出的代码生成器。根据我的经验,如果您使用 null (DbNull.Value) 作为所有参数的值来调用它们,则大多数 SELECT 任何内容的过程都会输出相同的架构。您可以从系统视图中获取参数列表本身,尽管我发现使用 INFORMATION_SCHEMA.PARAMETERS 很方便。

通过在事务中执行过程并始终回滚,即使您不知道过程的作用,您也可以安全地执行内容。

您可能需要一个基本的 GUI 并允许用户修改参数 - 或配置文件或其他方式来为特定过程提供参数值。存储过程可能会根据参数产生具有不同模式的输出,尽管我还没有看到很多这样做的。


0
投票

app.config

<appSettings>
    <add key="Schema_Name" value ="[dev]."/> <!-- use any one [dev]. or [dbo]. -->
</appSettings>

C#读取密钥:

string schema_Name = Configuration["Schema_Name"].ToString();

执行存储过程:

SqlConnection objConn = new SqlConnection(Connection);
objConn.Open();
SqlCommand cmd = new SqlCommand("Exec WLTCVarification", objConn);
cmd.Parameters.Add("@SchemaName", SqlDbType.Text);
cmd.Parameters["@Schema_Name"].Value = schema_Name; // dev or dbo;
rowsAmount = (string)cmd.ExecuteScalar();
objConn.Close();

C# SQL 查询:

SqlConnection objConn = new SqlConnection(Connection);
objConn.Open();
SqlCommand cmd = new SqlCommand("select * from " + schema_Name + "receive_agv_onlyerror, objConn);
rowsAmount = (string)cmd.ExecuteScalar();
objConn.Close();
© www.soinside.com 2019 - 2024. All rights reserved.