确定SQL Server查询(存储过程)结果类型

时间:2015-12-11 21:11:23

标签: c# sql-server stored-procedures orm code-generation

我计划将我的数据组织在SQL Server中,作为我自己的一小部分,在我的代码中为每个数据创建元数据类。

对于我正在对对象进行硬编码的测试,下一步是使用SQL Server查询生成每个对象的属性。

现在我在C#中处理我的代码的存储过程部分 我想知道如何以某种方式使用SQL Server查询执行的命令的结果类型?

例如,在这里,我们知道它甚至通过阅读其名称来做什么......

[dbo].[GtallDrLFilesCount]

但是另一个可以选择其他类型的返回,例如行集字符串等'

使用上面的存储过程将返回一个int:

if(@AllDrives=1) Begin 
        Select 
          * From [dbo].[HddFolderFiles]
End

但是下一个(上面)选择所有内容而不是RowsCount

我打算访问SQL Server并查询它的对象,因为我不打算设置返回参数(OUT),是否有更优雅的方法来实现它,而不是解析{{1存储过程的文件?

如果文字包含.sql(这是一个行集),则需要SELECT * 如果text包含DataTable(这是int),则准备int类型变量。

我认为在我没有为我的存储过程分配一个out参数的情况下,SQL Server能否以某种方式告诉返回类型,即使它没有Select COUNT(*)参数可以让它变得容易吗?

2 个答案:

答案 0 :(得分:1)

我认为您必须执行SProc来获取它的列,但是您可以使用set fmtonly

实际执行此操作

当你使用c#时,即使是返回单个值的sprocs(例如 - int)也会返回一个表...所以你只需要看一下读者的列来获取你想要的数据。

所以:

set fmtonly on
exec [dbo].[MyStoredProc] 0
set fmtonly off

将返回您可以在c#

中检查的记录集
var adoCon = new System.Data.SqlClient.SqlConnection(_sConnectStr);
var adoCmd = new System.Data.SqlClient.SqlCommand("your SQL (above)", adoCon);

var Rows = adoCmd.ExecuteReader();
DataTable dtSchema = Rows.GetSchemaTable();

现在 - 您可以浏览dtSchema以获取列。它不是纯SQL,但它是一种c#+ SQL方法。 [dbo].[GtallDrLFilesCount]将返回单个列表(int类型的列)。

显然 - 使用SQL命令(不是字符串)。下一个技巧是将SQL类型转换为本机c#类型(对于某些数据类型很容易,对其他数据类型也很棘手......看看ADOCommand的ReturnProviderSpecificTypes选项)。

希望有所帮助!

答案 1 :(得分:1)

SQL Server 2012+开始,您可以使用sys.dm_exec_describe_first_result_set来阅读有关结果集的元数据:

  

此动态管理函数将Transact-SQL语句作为   参数并描述第一个结果集的元数据   言。

SELECT *
FROM sys.dm_exec_describe_first_result_set(
   N'EXEC [dbo].[MyProcedure]', NULL, 0);

SELECT *
FROM sys.dm_exec_describe_first_result_set(
   N'SELECT * FROM [dbo].[tab]', NULL, 0);

SqlFiddleDemo

此方法限制了更多信息阅读Remarks section