包含多个 If Else Select 语句的存储过程

Stored Procedure containing Multiple If Else Select Statements

第一次发帖! :D

我一直在到处寻找这个问题的答案,虽然我认为它应该很简单,但我在任何地方都找不到直接的答案。我正在尝试创建一个存储过程,该过程将存储多个,可能有数百个 select 语句...只有其中一个最终会 运行... 在 @Look 参数是给定(即 table 名称)。

但是,我不断收到此错误:

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

不知道你为什么要这样做,但如果你出于某种奇怪的原因不得不这样做,那么就这样做......

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

如果我们可以假设@Look 变量的值将是 table 名称,那么您真正需要做的就是设置一个变量来包含列名称。存储过程可能如下所示:

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'