包含多个 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 If
和 Else
语句。如何将 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'
第一次发帖! :D
我一直在到处寻找这个问题的答案,虽然我认为它应该很简单,但我在任何地方都找不到直接的答案。我正在尝试创建一个存储过程,该过程将存储多个,可能有数百个 select 语句...只有其中一个最终会 运行... 在 @Look
参数是给定(即 table 名称)。
但是,我不断收到此错误:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
错误指向 Else If
和 Else
语句。如何将 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'