【问题标题】:Reading result data set of stored procedure读取存储过程的结果数据集
【发布时间】:2015-08-15 20:04:53
【问题描述】:

我正在从存储过程创建 aspx 表单生成器,我有类似的存储过程

CREATE PROCEDURE [dbo].[OU_Test_ALL]
@ID_Login uniqueidentifier = null,
@ID int = null
AS
BEGIN

declare @Error int, @Message varchar(500), @SQL varchar(max)
set @Message = 'Error'

exec @Error=dbo.CheckPermissions @ID_Login=@ID_Login, @ID=@ID, @ID_Action='OU_Test_ALL'
begin
  goto FAILED
end

select
        OU_Test.Value1Int,
        OU_Test.Value2Varchar,
        OU_Test.Value3Bit,
        OU_Test.Value4Varchar,
        OU_Test.Value5Int
from OU_Test
where (@ID is null or OU_Test.ID=@ID)

return 0

FAILED:
raiserror (@Message, 16, 1)
return 1

END

我需要读取结果而不调用它。

我能够使用

在 Management Studio 中获取一些元数据
SET FMTONLY ON;
exec OU_Test_ALL
SET FMTONLY OFF;

,但我无法在我的 C# 应用程序中读取此元数据。

有什么方法可以在不调用存储过程的情况下读取结果列?

【问题讨论】:

  • 欢迎来到stackoverflow。请阅读How to Ask。提示:你的问题不是很清楚 - 你想做什么?
  • 我只想读取可能的输出列 (Value1Int, Value2Varchar, ...) 及其数据类型而不调用过程。

标签: sql-server sql-server-2008 procedure


【解决方案1】:

我建议使用SqlDataReader.GetSchemaTable 方法。使用SET FMTONLY ON; 调用您的存储过程,该结构将在GetSchemaTable() 返回的DataTable 中可用。

或者,如果您传入SchemaOnlyCommandBehaviorSqlCommandExecuteReader 方法有一个重载,可以为您处理SET FMTONLY

类似的东西:

SqlDataReader _Reader = null;

_Reader = _Command.ExecuteReader(CommandBehavior.SchemaOnly);
DataTable _Schema = _Reader.GetSchemaTable();

【讨论】:

    【解决方案2】:

    这是如何调用你的stored procedure

       SqlCommand command = new SqlCommand("SET FMTONLY ON; exec sp_sptest; SET FMTONLY OFF;"
                                           , connection);
    
        command.Connection.Open();
    
        var reader = command.ExecuteReader();
        DataTable resultTable = new DataTable();
        resultTable.Load(reader);
    
        command.Connection.Close();
    

    列已归档,您可以查看列类型、名称等。未填充行。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2011-07-24
      相关资源
      最近更新 更多