Схема из хранимой процедуры

У меня есть процедура, я хочу прочитать схему процедуры. Для получения схемы просмотра я использую запрос, показанный здесь. Таким же образом я хочу получить схему хранимой процедуры. Как получить его? Плз покажи какой-нибудь синтаксис.

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;
}       

Если есть запрос, пожалуйста, спросите. Спасибо заранее.

6 ответов

Решение

Ты мог бы сделать

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; 
}

Надеюсь это поможет

Это ответ, который не вызывает 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

Вы могли бы получить информацию о параметрах хранимой процедуры, но без ее выполнения SQL Server не может сказать вам структуру наборов данных, возвращаемых хранимой процедурой. Поскольку выполнение хранимой процедуры может иметь побочные эффекты, ADO.NET не предоставляет метод для сообщения вам, как будут выглядеть наборы результатов, если бы хранимая процедура была выполнена. Кроме того, набор (ы) результатов может изменяться в зависимости от параметров, передаваемых процедуре при ее выполнении.

App.config

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

С# чтение ключа

      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();

С# 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();

Я не понимаю ваш вопрос ясно, я думаю, что это будет работать с вами

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

Замените ваш запрос этим, и он будет работать нормально

Я создал различные генераторы кода, которые используют вывод хранимых процедур. По моему опыту, большинство процедур, которые выбирают что-либо из SELECT, выводят свою схему точно так же, если вы вызываете их со значением null (DbNull.Value) в качестве значения для всех параметров. Вы можете получить сам список параметров из системных представлений, хотя я считаю удобным использовать INFORMATION_SCHEMA.PARAMETERS.

Выполняя процедуру в транзакции и всегда откатываясь, вы можете безопасно выполнять какие-либо действия, даже если вы не знаете, что делает процедура.

Вероятно, вам понадобится базовый графический интерфейс и пользователь сможет изменять параметры - или файл конфигурации, или какой-либо другой способ предоставления значений параметров для определенных процедур. Хранимая процедура может выдавать выходные данные с разными схемами в зависимости от параметров, хотя я не видел многих, которые это делают.

Другие вопросы по тегам