2017-02-20 79 views
0

第一次海报! :D包含多个IfEse Select语句的存储过程

我一直在寻找这个无处不在的答案,并且我认为它应该是这么简单,我无法在任何地方找到直接答案。我试图创建一个存储过程,将存储多个可能为数百个select语句的存储过程......在给出@Look参数(即表名称)后,其中只有一个实际上最终会运行。

不过,我不断收到此错误:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

错误指向到Else IfElse语句。我如何将exists引入这些陈述?我试过调整它们无济于事。

下面是一个示例数据库我的脚本:

CREATE PROCEDURE [dbo].[sp_Look] 
    (@Look varchar(50)) 
AS 
    DECLARE @Lookup VARCHAR(500) 

    IF (@Look = 'Employee_Information') 
     SET @Lookup = (SELECT EmployeeId, EmployeeSSN, EmployeeStatus 
         FROM Employee_Information) 
    Else If (@Look = 'Employee_Demographic') 
     SET @Lookup = (SELECT LastName, FirstName, DateOfBirth 
         FROM Employee_Demographic) 
    Else 
     SET @Lookup = 'No Table' 

    SELECT @Lookup 
+0

什么让你觉得有SP逻辑,而它可以很容易地处理成您商务 – user7417866

+0

层[是在以sp_前缀还是一个禁忌? - 亚伦伯特兰](https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix) – SqlZim

+0

我是老实说,相当新的SQL,这是一个小项目,我正在努力,所以我不完全确定您所指的是由业务层处理的内容? – Mesanic

回答

0

如果我们可以假设@Look变量的值是表名,那么你真正需要做的就是设置一个变量来包含列名。存储过程可以是这个样子:

CREATE PROCEDURE [dbo].[sp_Look] 
(@Look varchar(50)) 

AS 

SET NOCOUNT ON; 

-- check for sql injection 
IF CHARINDEX(';', ISNULL(@Look,'')) != 0 
BEGIN 
RAISERROR('Invalid input parameter', 16, 1) 
RETURN -1 
END 

Declare @SQL nvarchar(MAX);  

IF (@Look = 'Employee_Information') 
    SET @SQL = N'EmployeeId, EmployeeSSN, EmployeeStatus'      
ELSE IF (@Look = 'Employee_Demographic') 
    SET @SQL = N'LastName, FirstName, DateOfBirth' 

IF (@SQL is not null) 
BEGIN 
    SET @SQL = N'SELECT ' + @SQL + ' FROM '+ QUOTENAME(@Look) + ';'; 
    EXEC sys.sp_executesql @SQL; 
END 
ELSE 
    SELECT 'No Table' 
+0

谢谢,这真是太好了,并且完成了我期待的任务。我从原来的设计中脱颖而出,我感谢你花时间把这些放在一起。:)我不能说我完全理解了这个答案中正在发生的一切,但它有效,它很棒,所以这对我来说已经足够了。我需要深入并弄清楚它是如何工作的。 – Mesanic

0

不知道你为什么这样做,但如果你有一些奇怪的原因,做这样的事情.....

Create Procedure [dbo].[usp_Look] --<-- do not use sp_ prefix for user procs 
@Look SYSNAME      --<-- Use appropriate data type for sql server objects 
AS 
BEGIN 
    SET NOCOUNT ON; 
    Declare @Sql nvarchar(MAX); 

     -- Use dynamic sql rather than using if..else blocks 
IF OBJECT_ID(@Look) IS NOT NULL 
BEGIN 
    SET @Sql = N' SELECT * FROM ' + QUOTENAME(@Look) + ';'; 
    EXEC sys.sp_executesql @Sql; 
END 
ELSE 
    BEGIN 
    SELECT 'Table Does not exists'; 
    END 

END 
+0

如果我要为每个表保留选定的列,这将是一个很好的解决方案;然而,在这种情况下,每个select语句都需要提取一组不同的特定列。我喜欢你提供了很多这个脚本,但需要克服这个驼峰。另外,我们的目的是通过简短的方式声明每个表名,而不是Employee_Information,它将是EI,并且这是您使用@Look提供的参数。 – Mesanic

相关问题