Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:存储过程中的Switch语句_Sql_Sql Server_Stored Procedures_Case - Fatal编程技术网

SQL Server:存储过程中的Switch语句

SQL Server:存储过程中的Switch语句,sql,sql-server,stored-procedures,case,Sql,Sql Server,Stored Procedures,Case,在PHP和JavaScript中,可以使用Switch语句来避免使用多个if/case语句 有没有一种方法可以在SQL中实现类似的功能,以便针对每种情况运行不同的Select? 我不需要在这里介绍默认情况,只需要介绍一些不同的情况 PHP示例: 在我的例子中,我希望有多个案例,每个案例都有一个不同的Select,都在同一个存储过程中 这里有人能告诉我这是否以及如何在SQL中实现吗 非常感谢,Tim。您可以使用用例进行更简单的操作,也可以使用动态SQL进行更复杂的查询 CASE可以在普通的sele

在PHP和JavaScript中,可以使用Switch语句来避免使用多个if/case语句

有没有一种方法可以在SQL中实现类似的功能,以便针对每种情况运行不同的Select? 我不需要在这里介绍默认情况,只需要介绍一些不同的情况

PHP示例:

在我的例子中,我希望有多个案例,每个案例都有一个不同的Select,都在同一个存储过程中

这里有人能告诉我这是否以及如何在SQL中实现吗

非常感谢,Tim。

您可以使用用例进行更简单的操作,也可以使用动态SQL进行更复杂的查询

CASE可以在普通的selects/views/table值函数中使用,如下所示:

SELECT CASE WHEN x1=1 THEN (SELECT id FROM someTable) ELSE (SELECT id FROM otherTable)
为了使用动态SQL,您可以将SQL定义为字符串,也可以结合CASE。注意:这只能在存储过程中使用:

DECLARE query VARCHAR(max)
SET query = 'SELECT * FROM ' + CASE WHEN @myVariableInput =  THEN 'Table1' ELSE 'Table2' END + ' WHERE some_condition='+@parameterForIt
EXEC sp_executeSql query
但是,请注意,这通常不是最佳做法,因为数据库将与不同表的不同执行计划相混淆。最佳实践是您在PHP中定义的,针对不同的情况使用不同的存储过程:

switch ($myVariableInput) {
   case "input1":
     // execute StoredProcedure1
     break;
   case "input2":
     // execute StoredProcedure2
     break;
   case "input3":
     // execute StoredProcedure3
     break;
}
您可以使用用例进行更简单的操作,也可以使用动态SQL进行更复杂的查询

CASE可以在普通的selects/views/table值函数中使用,如下所示:

SELECT CASE WHEN x1=1 THEN (SELECT id FROM someTable) ELSE (SELECT id FROM otherTable)
为了使用动态SQL,您可以将SQL定义为字符串,也可以结合CASE。注意:这只能在存储过程中使用:

DECLARE query VARCHAR(max)
SET query = 'SELECT * FROM ' + CASE WHEN @myVariableInput =  THEN 'Table1' ELSE 'Table2' END + ' WHERE some_condition='+@parameterForIt
EXEC sp_executeSql query
但是,请注意,这通常不是最佳做法,因为数据库将与不同表的不同执行计划相混淆。最佳实践是您在PHP中定义的,针对不同的情况使用不同的存储过程:

switch ($myVariableInput) {
   case "input1":
     // execute StoredProcedure1
     break;
   case "input2":
     // execute StoredProcedure2
     break;
   case "input3":
     // execute StoredProcedure3
     break;
}

非常感谢。在我的情况下,大约有50个案例,每个案例都需要使用同一个表使用不同的Select语句。每个选择都相对较小,但都有不同的查询结构。在这种情况下,您会推荐上面的工作流吗?执行的最佳方法是有50个存储过程,但如果表的条目少于十亿个,我认为这有点过分了。动态SQL应该可以很好地实现这一点。或者,如果查询在没有聚集的情况下部分重叠,那么也可以考虑将一个更大的查询定义为覆盖所有可能情况的视图,然后从视图中选择。我将尝试使用动态解决方案,因为表一开始只包含几百条记录。非常感谢。在我的情况下,大约有50个案例,每个案例都需要使用同一个表使用不同的Select语句。每个选择都相对较小,但都有不同的查询结构。在这种情况下,您会推荐上面的工作流吗?执行的最佳方法是有50个存储过程,但如果表的条目少于十亿个,我认为这有点过分了。动态SQL应该可以很好地实现这一点。或者,如果查询在没有聚集的情况下部分重叠,那么也可以考虑将一个更大的查询定义为覆盖所有可能情况的视图,然后从视图中选择。我将尝试使用动态解决方案,因为表一开始只包含几百条记录。