将存储过程中使用的逻辑传递给调用C#应用程序

时间:2011-08-22 18:05:50

标签: c# tsql stored-procedures

我有一个从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#app执行了哪两个SELECT语句?

5 个答案:

答案 0 :(得分:5)

添加另一列是错误的方法 - 特别是使用更大的结果集。您通过使用应该是一次性值的每一条记录污染来增加数据。

也就是说,我建议您为存储过程选择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

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

答案 1 :(得分:4)

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

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

Get output parameter value in ADO.NET

答案 2 :(得分:3)

IF x=y
  SELECT colX, colY, 'case1' as WhichBranch
  FROM TableA
ELSE
  SELECT colX, colY, 'case2' as WhichBranch
  FROM TableA
  WHERE colX > 100

答案 3 :(得分: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 :(得分:2)

像这样扩展存储过程:

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