【问题标题】:Communicate the logic used in a stored procedure to the calling C# application将存储过程中使用的逻辑传递给调用 C# 应用程序
【发布时间】:2011-08-22 18:05:49
【问题描述】:

我有一个从 C# 应用程序调用的存储过程。这个存储过程有两个互斥的代码路径;它们都返回相似类型的记录,如下所示:

IF x=y
  SELECT colX, colY
  FROM TableA
ELSE
  SELECT colX,colY
  FROM TableA
  WHERE colX > 100

手头的任务涉及将 sp 调用的结果写入文本文件;文件名取决于执行了两个 SELECT 中的哪一个。名称将是 MyTextFile.txt 或 MyTextFileGT100.txt

如何告诉 C# 应用执行了两个 SELECT 语句中的哪一个?

【问题讨论】:

    标签: c# tsql stored-procedures


    【解决方案1】:

    添加另一列是错误的方法 - 特别是对于较大的结果集。您会通过使用一次性值污染每条记录来增加网络上的数据。

    也就是说,我建议为您的存储过程使用可选的output parameter

    @branchId int = null output
    

    然后在你的逻辑块中设置它:

    if x=y begin
    
      set @branchId = 1
    
      SELECT colX, colY
      FROM TableA
    
    end else begin
    
      set @branchId = 2
    
      SELECT colX,colY
      FROM TableA
      WHERE colX > 100
    
    end
    

    此解决方案可防止更改您的结果集,并且如果您始终明确命名过程参数,则不应影响任何代码。此外,与 添加列 选项相比,您还可以通过线路获得更少的数据。

    【讨论】:

      【解决方案2】:

      您可以在存储过程中使用输出参数并使用它来决定文本文件的名称。有关详细信息,请参阅下面的链接;

      http://www.daniweb.com/software-development/csharp/threads/110318

      Get output parameter value in ADO.NET

      【讨论】:

        【解决方案3】:

        你可以这样做:

        IF x=y
          SELECT colX, colY, 'Method1' as method
          FROM TableA
        ELSE
          SELECT colX,colY, 'Method2' as method
          FROM TableA
          WHERE colX > 100
        

        【讨论】:

          【解决方案4】:
          IF x=y
            SELECT colX, colY, 'case1' as WhichBranch
            FROM TableA
          ELSE
            SELECT colX, colY, 'case2' as WhichBranch
            FROM TableA
            WHERE colX > 100
          

          【讨论】:

          • 在完全相同的时间给出完全相同的答案...令人印象深刻。
          【解决方案5】:

          像这样扩展存储过程:

          IF x=y
            SELECT colX, colY, 'MyTextFile.txt' AS FN
            FROM TableA
          ELSE
            SELECT colX,colY, 'MyTextFileGT100.txt' AS FN
            FROM TableA
            WHERE colX > 100
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-18
            • 1970-01-01
            • 1970-01-01
            • 2020-03-26
            • 2019-09-25
            • 1970-01-01
            • 2013-12-05
            • 1970-01-01
            相关资源
            最近更新 更多