我有许多存储过程需要用System.Data.Entity.Database.ExecuteSqlCommand
或System.Data.Entity.Database.SqlQuery
调用
我的存储过程需要许多参数,包括输出参数。手动编码参数创建可能需要一些时间,并且可能是错误的。
有没有办法基于给定的 T-SQL 存储过程自动生成ExecuteSqlCommand
或SqlQuery
调用?
我知道我可以使用.edmx
模型,但据我所知,.edmx
模型都使用函数导入。我喜欢直接拨打ExecuteSqlCommand
或SqlQuery
电话。
本身不是一个完整的解决方案,但下面是一些 SQL 查询,它们将返回必要的存储过程参数和结果信息。您可以将这些模板与 T4 模板(或类似模板(一起使用,以生成数据访问代码。
存储过程参数:
select
schema_name(sp.schema_id) as schema_name,
sp.name as procedure_name,
p.name as parameter_name,
typ.name as type_name,
p.max_length,
p.precision,
p.scale,
p.is_output
from sys.procedures sp
left join sys.parameters p on p.object_id = sp.object_id
left join sys.types typ on typ.user_type_id = p.user_type_id
order by schema_name, sp.name, p.parameter_id
存储过程结果:
if serverproperty('islocaldb') is not null -- identifies sql server 2012+, which is the first version that supports dm_exec_describe_first_result_set_for_object
or serverproperty('edition') = 'SQL Azure' -- azure sql also supports dm_exec_describe_first_result_set_for_object
select
schema_name(sp.schema_id) as schema_name,
sp.name as procedure_name,
rs.name as column_name,
typ.name as type_name,
rs.max_length,
rs.precision,
rs.scale
from sys.procedures sp
cross apply sys.dm_exec_describe_first_result_set_for_object(sp.object_id, 0) rs
join sys.types typ on typ.system_type_id = rs.system_type_id
order by schema_name, sp.name, rs.column_ordinal
else
select
null as schema_name,
null as procedure_name,
null as column_name,
null as type_name,
null as max_length,
null as precision,
null as scale