【问题标题】:Determine SQL Server query (stored procedure) result type确定 SQL Server 查询(存储过程)结果类型
【发布时间】:2016-03-17 21:41:02
【问题描述】:

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

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

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

例如,在这里我们甚至通过阅读它的名字就知道它在做什么......

[dbo].[GtallDrLFilesCount]

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

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

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

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

我打算访问 SQL Server 并查询它的对象,并且由于我不打算设置返回参数 (OUT),有没有更优雅的方法来实现它,而不是解析存储的 .sql 文件流程?

如果文本包含SELECT *(这是一个行集),则期望它与DataTable 如果文本包含 Select COUNT(*)(这是 int)准备 int 类型变量。

我想如果我没有为我的存储过程分配一个 out 参数,SQL Server 是否可以通过某种方式告诉返回类型,即使它没有 out 参数以使其变得容易?

【问题讨论】:

  • 我建议您将尽可能多的存储过程更改为存储函数。然后将返回类型指定为定义的一部分。
  • @marc_s 嘿,马克,有时间回复,有一个教训/附加值,在我正在编码的这些“实验”中学习,..所有这些我都没有希望找到更快和/或更定制/更好的方法,但主要是为了我的经验。我发现尝试处理 .net 中的许多有趣的内置模块以及来自众多选定作者和 API 类别的一些扩展是非常有教育意义的
  • @marc_s 看着@你的记录,我想我永远不会达到你的 XP 但我会比学习你努力学习和教育自己的所有课程和课程更快地接近,再加上你在职业生涯中参与的项目的经验,我的方法是省去那些努力(:我自己做,与你所牺牲的相比,这是我愿意走的捷径,在“你的时间”并不容易(就像现在一样......堆栈溢出即将到来)还有一些额外改进的资源,想象一下如果像你这样的人现在开始他的职业生涯。
  • @marc_s,如果那些 ORM 没有一次又一次地重新发明轮子 -> 无穷大,它们就不会很多,只有一个,不是吗?

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


【解决方案1】:

我认为您必须执行 SProc 才能获取它的列,但您可以在不使用 set fmtonly 实际返回数据的情况下执行此操作

当你使用 c# 时,即使是返回单个值(例如 - int)的存储过程也会返回一个表......所以你只需要看看 reader 的 Columns 就可以获得你想要的数据。

所以:

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 选项)。

希望有帮助!

【讨论】:

  • 是的,它确实有帮助,所以 fmtonly 在 sql 中用于 Sproc,类似于 SchemaOnly 在 C# 命令类型中它执行但没有数据内容,所以通过 sqldatareader 读取它以查看列 DataType 会很好想法!我认为这是一个正确的答案,但我会在我决定之前给它一些时间来深入了解(:谢谢!
  • 现在我不知道从 15 分钟前我将采用哪种方法 @lad2025 添加了他的答案,我会尽快尝试它们,非常感谢你们两个! !
【解决方案2】:

您可以从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

【讨论】:

  • 这很好,因为我保存了供以后使用以在服务器表对象上实现另一种更复杂的方法来获得相同的结果查询 sys 表对象及其结构以及表对象的此代码并返回存储过程的类型都可以使用该代码,现在我需要的只是下一步(不包括在这个问题中)是每个 Sproc 对象 上的参数和其余相关元数据,例如 sproc 名称和参数就像你对 table 和 cols 所做的那样。
  • 并发现 Sproc 元数据查询也在您上面发布的链接周围的某处:msdn.microsoft.com/en-us/library/ms345522.aspx#_FAQ9
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多