Sql server 如何使用参数选择要使用的查询?

Sql server 如何使用参数选择要使用的查询?,sql-server,ssms,Sql Server,Ssms,我正在制作一份报告,我需要在此报告上显示在过去2年中销售额超过5000美元或在运行报告时销售额超过500美元的帐户 声明@Options INT=1 -当我放0的时候 选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 介于DATEADDyy、DATEDIFFyy、0、GETDATE、0和GETDATE之间的PostDate 按客户分组 价格>500 按客户订购 -当我放1的时候 选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 介于DATEADDYear,-2,G

我正在制作一份报告,我需要在此报告上显示在过去2年中销售额超过5000美元或在运行报告时销售额超过500美元的帐户

声明@Options INT=1 -当我放0的时候 选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 介于DATEADDyy、DATEDIFFyy、0、GETDATE、0和GETDATE之间的PostDate 按客户分组 价格>500 按客户订购 -当我放1的时候 选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 介于DATEADDYear,-2,GETDATE和GETDATE之间的PostDate 按客户分组 价格>5000 按客户订购
一种简单的方法是将AND@Options=0添加到第一个查询的WHERE子句中,将AND@Options=1添加到第二个查询的WHERE子句中。然后将两个查询合并为一个查询。

一个简单的方法是将AND@Options=0添加到第一个查询的WHERE子句中,将AND@Options=1添加到第二个查询的WHERE子句中。然后将两个查询合并为一个查询。

用最简单的术语来说,如下所示:

IF @Options = 1
  BEGIN
   ... query 1
  END
ELSE
  BEGIN
   ... query 2
  END
ELSE

用最简单的术语来说,比如:

IF @Options = 1
  BEGIN
   ... query 1
  END
ELSE
  BEGIN
   ... query 2
  END
ELSE
一种方法是使用CASE语句:

选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 CASE@Options之间的PostDate 当0时,则为DATEADDyy、DATEDIFFyy、0、GETDATE、0 当1之后是DATEADDYear,-2,GETDATE 否则无效 终止 和GETDATE 按客户分组 拥有SUMPrice>CASE@Options 当0等于5000时 当1到500 否则无效 终止 按客户订购; 这看起来不太好看,但应该可以工作,我可能留下了一个语法错误

另一种方法是声明变量并在查询中使用它们:

声明@PriceTreshold INT=CASE@Options 当0等于5000时 当1到500 否则无效 终止 声明@PostDateFrom DATETIME2=CASE@Options 当0时,则为DATEADDyy、DATEDIFFyy、0、GETDATE、0 当1之后是DATEADDYear,-2,GETDATE 否则无效 终止 选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 PostDate介于@PostDateFrom和GETDATE之间 按客户分组 有SUMPrice>@PriceTreshold 按客户订购; 您的查询并不是真的不同,它们只是基于@Options有不同的筛选条件

如果它们真的那么不同,您可以使用这种语法:

如果@Options=0 开始 -如果@Options=0,则执行SQL查询 终止 如果@Options=1,则为ELSE 开始 -如果@Options=1,则执行SQL查询 终止 但在您的案例中不需要这样做。

一种方法是使用案例语句:

选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 CASE@Options之间的PostDate 当0时,则为DATEADDyy、DATEDIFFyy、0、GETDATE、0 当1之后是DATEADDYear,-2,GETDATE 否则无效 终止 和GETDATE 按客户分组 拥有SUMPrice>CASE@Options 当0等于5000时 当1到500 否则无效 终止 按客户订购; 这看起来不太好看,但应该可以工作,我可能留下了一个语法错误

另一种方法是声明变量并在查询中使用它们:

声明@PriceTreshold INT=CASE@Options 当0等于5000时 当1到500 否则无效 终止 声明@PostDateFrom DATETIME2=CASE@Options 当0时,则为DATEADDyy、DATEDIFFyy、0、GETDATE、0 当1之后是DATEADDYear,-2,GETDATE 否则无效 终止 选择 客户,价格等于销售额 从…起 SOP30200诺洛克 哪里 PostDate介于@PostDateFrom和GETDATE之间 按客户分组 有SUMPrice>@PriceTreshold 按客户订购; 您的查询并不是真的不同,它们只是基于@Options有不同的筛选条件

如果它们真的那么不同,您可以使用这种语法:

如果@Options=0 开始 -如果@Options=0,则执行SQL查询 终止 如果@Options=1,则为ELSE 开始 -如果@Options=1,则执行SQL查询 终止
但这在你的情况下不是必需的。

这很难看。至少,编写2个不同的存储过程,并有一个门卫过程来执行决策过程。从好的方面来看,您的返回列在这里看起来是一致的。请永远不要从同一过程返回不同的结果集。这太难看了。至少,编写2个不同的存储过程,并有一个门卫过程来执行决策过程。从好的方面来看,您的返回列在这里看起来是一致的。请永远不要从同一过程返回不同的结果集。