Схема из хранимой процедуры
У меня есть процедура, я хочу прочитать схему процедуры. Для получения схемы просмотра я использую запрос, показанный здесь. Таким же образом я хочу получить схему хранимой процедуры. Как получить его? Плз покажи какой-нибудь синтаксис.
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.
Выполняя процедуру в транзакции и всегда откатываясь, вы можете безопасно выполнять какие-либо действия, даже если вы не знаете, что делает процедура.
Вероятно, вам понадобится базовый графический интерфейс и пользователь сможет изменять параметры - или файл конфигурации, или какой-либо другой способ предоставления значений параметров для определенных процедур. Хранимая процедура может выдавать выходные данные с разными схемами в зависимости от параметров, хотя я не видел многих, которые это делают.