在 THEN 子句中的 case 语句中将字符串分配给变量
Assigne a string to a variable in a case statement in the THEN clause
这是我的。我试过用引号代替 =,我已经删除了变量并只尝试用引号括起来的 select 语句。失去理智试图弄清楚这一点。
是的,这是家庭作业,我不是要你为我写,只是让我知道为什么我似乎无法让它工作以及我做错了什么。
这个案例大约有 7 时长,但我无法通过第一个。
请帮忙。
我知道人们不喜欢做家庭作业,所以把这看作是教我。谢谢,
CREATE PROC usr_spChooseReport(@ReportNum int)
AS
declare @sqlString nvarchar(500)
SELECT CASE(@ReportNum)
WHEN 1 THEN @sqlString =''select book.Title, Book_Copies.No_of_Copies, Library_Branch.BranchName from Book inner join Book_Copies on book.BookID=Book_Copies.BookID inner join Library_Branch on Book_Copies.BranchID=Library_Branch.BranchID where ONVERT(NVARCHAR(MAX),Library_Branch.BranchName) = 'Sharptown'
and CONVERT(NVARCHAR(MAX), Book.Title) ='The Lost Tribe'''
ELSE 'Unknown'
END
但是如果我尝试这个,
CREATE PROC usr_spChooseReport(@ReportNum int)
AS
SELECT CASE(@ReportNum)
WHEN 1 THEN (select book.Title, Book_Copies.No_of_Copies, Library_Branch.BranchName from Book inner join Book_Copies on book.BookID=Book_Copies.BookID inner join Library_Branch on Book_Copies.BranchID=Library_Branch.BranchID where CONVERT(NVARCHAR(MAX),Library_Branch.BranchName) = 'Sharptown'
and CONVERT(NVARCHAR(MAX), Book.Title) ='The Lost Tribe')
ELSE 'Unknown'
END
我收到此错误:
Only one expression can be specified in the select list when the
subquery is not introduced with EXISTS.
第二次看了你的问题,我想我明白了。他们希望您使用 case 语句将变量 @sqlString 设置为字符串,即 select 语句。然后在某个时候他们会 EXEC (@sqlString)
其余情况您需要按照您的第一个示例进行操作。
WHEN 2 THEN @sqlString = 'SELECT * FROM Somewhere'
WHEN 3 THEN @sqlString = 'SELECT * FROM SomewhereElse'
第一个示例和第二个示例之间的区别在于,在第一个示例中,它们将字符串值分配给变量@sqlString。在您的第二个示例中,您是 运行 一个 returns 多个表达式的查询。两个完全不同的东西。
首先,这是一个时髦的问题。如果您遵循这种模式,您会对 7 个数字中的每一个进行完全不同的查询吗?
我希望所有的查询都是相同的,只是传递了不同的参数。然后我会像这样创建一个查找 table:
DECLARE @LookUpTable TABLE (ID INT PRIMARY KEY, LibraryBranch VARCHAR(25), Book_Name VARCHAR(25))
INSERT INTO @LookUpTable
VALUES (1,'Sharptown','The Lost Tribe'),
(2,'Other Branch','Other book');
DECLARE @ReportNum INT = 1;
select book.Title, Book_Copies.No_of_Copies, Library_Branch.BranchName
FROM Book
inner join Book_Copies
on book.BookID=Book_Copies.BookID
inner join Library_Branch
on Book_Copies.BranchID=Library_Branch.BranchID
inner join @LookUpTable LT
on Library_Branch.BranchName = LT.LibraryBranch
AND Book.Title = LT.Book_Name
WHERE LT.ID = @ReportNum
但是如果您确实对每种情况都有不同的查询,那么要么尝试 Jchao 的方法并在最后使用 EXEC(@sqlString),要么您可以使用 if 语句。注意:ELSE IF 意味着它将 运行 只有一个查询,因此一旦找到匹配项,它将 运行 那个查询然后完成,但如果没有找到匹配项,则最后是 ELSE将 运行
DECLARE @ReportNum INT = 1;
IF (@ReportNum = 1)
BEGIN
SELECT 1 --query 1
END
ELSE IF (@ReportNum = 2)
BEGIN
SELECT 2 --query 2
END
--etc to 7
ELSE
BEGIN
SELECT 'Unknown' --query 8 for unknown
END
这是我的。我试过用引号代替 =,我已经删除了变量并只尝试用引号括起来的 select 语句。失去理智试图弄清楚这一点。 是的,这是家庭作业,我不是要你为我写,只是让我知道为什么我似乎无法让它工作以及我做错了什么。 这个案例大约有 7 时长,但我无法通过第一个。 请帮忙。 我知道人们不喜欢做家庭作业,所以把这看作是教我。谢谢,
CREATE PROC usr_spChooseReport(@ReportNum int)
AS
declare @sqlString nvarchar(500)
SELECT CASE(@ReportNum)
WHEN 1 THEN @sqlString =''select book.Title, Book_Copies.No_of_Copies, Library_Branch.BranchName from Book inner join Book_Copies on book.BookID=Book_Copies.BookID inner join Library_Branch on Book_Copies.BranchID=Library_Branch.BranchID where ONVERT(NVARCHAR(MAX),Library_Branch.BranchName) = 'Sharptown'
and CONVERT(NVARCHAR(MAX), Book.Title) ='The Lost Tribe'''
ELSE 'Unknown'
END
但是如果我尝试这个,
CREATE PROC usr_spChooseReport(@ReportNum int)
AS
SELECT CASE(@ReportNum)
WHEN 1 THEN (select book.Title, Book_Copies.No_of_Copies, Library_Branch.BranchName from Book inner join Book_Copies on book.BookID=Book_Copies.BookID inner join Library_Branch on Book_Copies.BranchID=Library_Branch.BranchID where CONVERT(NVARCHAR(MAX),Library_Branch.BranchName) = 'Sharptown'
and CONVERT(NVARCHAR(MAX), Book.Title) ='The Lost Tribe')
ELSE 'Unknown'
END
我收到此错误:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
第二次看了你的问题,我想我明白了。他们希望您使用 case 语句将变量 @sqlString 设置为字符串,即 select 语句。然后在某个时候他们会 EXEC (@sqlString)
其余情况您需要按照您的第一个示例进行操作。
WHEN 2 THEN @sqlString = 'SELECT * FROM Somewhere'
WHEN 3 THEN @sqlString = 'SELECT * FROM SomewhereElse'
第一个示例和第二个示例之间的区别在于,在第一个示例中,它们将字符串值分配给变量@sqlString。在您的第二个示例中,您是 运行 一个 returns 多个表达式的查询。两个完全不同的东西。
首先,这是一个时髦的问题。如果您遵循这种模式,您会对 7 个数字中的每一个进行完全不同的查询吗?
我希望所有的查询都是相同的,只是传递了不同的参数。然后我会像这样创建一个查找 table:
DECLARE @LookUpTable TABLE (ID INT PRIMARY KEY, LibraryBranch VARCHAR(25), Book_Name VARCHAR(25))
INSERT INTO @LookUpTable
VALUES (1,'Sharptown','The Lost Tribe'),
(2,'Other Branch','Other book');
DECLARE @ReportNum INT = 1;
select book.Title, Book_Copies.No_of_Copies, Library_Branch.BranchName
FROM Book
inner join Book_Copies
on book.BookID=Book_Copies.BookID
inner join Library_Branch
on Book_Copies.BranchID=Library_Branch.BranchID
inner join @LookUpTable LT
on Library_Branch.BranchName = LT.LibraryBranch
AND Book.Title = LT.Book_Name
WHERE LT.ID = @ReportNum
但是如果您确实对每种情况都有不同的查询,那么要么尝试 Jchao 的方法并在最后使用 EXEC(@sqlString),要么您可以使用 if 语句。注意:ELSE IF 意味着它将 运行 只有一个查询,因此一旦找到匹配项,它将 运行 那个查询然后完成,但如果没有找到匹配项,则最后是 ELSE将 运行
DECLARE @ReportNum INT = 1;
IF (@ReportNum = 1)
BEGIN
SELECT 1 --query 1
END
ELSE IF (@ReportNum = 2)
BEGIN
SELECT 2 --query 2
END
--etc to 7
ELSE
BEGIN
SELECT 'Unknown' --query 8 for unknown
END