简短的答案是下面的存储过程,从@Aaron Bertrand 的正确答案修改,将以您似乎需要数据的方式返回您想要的结果。
CREATE PROCEDURE [dbo].[GetDepartmentName]
@ID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT
COALESCE(p.firstname, s.firstname) as firstname,
COALESCE(p.lastname, s.lastname) as lastname
FROM dbo.comment AS c
LEFT OUTER JOIN dbo.Professor AS p
ON c.pid = p.pid
LEFT OUTER JOIN dbo.Student AS s
ON c.sid = s.sid
WHERE c.vid = @ID;
END
GO
这里发生了几件事。我将向您详细介绍我所做的工作,并努力帮助您并解释如何继续前进,因为这是您在过去几天中提出的与此相关的第四个问题。
好的 - @Aaron Bertrand 的存储过程很好。他接受了您在问题中提供的查询并使其发挥作用,并为您的问题提供了很好的答案。但是,我认为您的问题存在一些问题。 要获得好的答案,您需要提出一个好的问题。
我去了您已经问过的其他相关问题之一,并得到了您的表结构和 IN MANAGEMENT STUDIO:创建了表并插入了您提供的数据,在本地编译了他的 sproc 并得到:
Msg 207, Level 16, State 1, Procedure GetDepartmentName, Line 14
Invalid column name 'id'.
Msg 207, Level 16, State 1, Procedure GetDepartmentName, Line 16
Invalid column name 'id'.
我从您的其他问题的表结构中知道我需要更改连接:
LEFT OUTER JOIN dbo.Professor AS p
ON c.pid = p.pid -- changed from c.pid = p.id, p.id is not a column
LEFT OUTER JOIN dbo.Student AS s
ON c.sid = s.sid -- changed from c.pid = s.id, s.id is not a column
我在存储过程语句之外复制了变量声明和查询,create
并进行了我提到的更改并设置了变量并突出显示并运行了这个。有效。当您遇到存储过程问题时,您可以执行此操作来测试您的查询是否只是语法或简单问题。
JOINS
我在存储过程中 进行了刚刚测试过的更改。我编译它并成功运行它。
以下是从 Management Studio 运行存储过程的方法(注意我在 MS 测试中使用EXEC,因为它易于键入,但了解 SP_EXECUTESQL 和 EXEC 之间的区别):
Execute a stored procedure:
[ [ EXEC [ UTE ] ]
{
[ @return_status = ]
{ procedure_name [ ;number ] | @procedure_name_var
}
[ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
[ ,...n ]
[ WITH RECOMPILE ]
你说“我试图声明输入和输出但没有运气”。 我不认为你真的想要输出变量——这很重要。我有一种非常强烈的感觉,您希望它作为结果集返回。做一些研究并了解从存储过程返回数据的不同方法。所以无论如何 - 给你 -Drop
或者Alter
你的旧 sproc 并尝试这个 - 它是从@Aaron's 快速修改的并且没有输出变量 - 它与我的答案开头的第一个相同。
CREATE PROCEDURE [dbo].[GetDepartmentName]
@ID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT
COALESCE(p.firstname, s.firstname) as firstname,
COALESCE(p.lastname, s.lastname) as lastname
FROM dbo.comment AS c
LEFT OUTER JOIN dbo.Professor AS p
ON c.pid = p.pid
LEFT OUTER JOIN dbo.Student AS s
ON c.sid = s.sid
WHERE c.vid = @ID;
END
GO
使用“EXEC”(管理工作室)在SSMS中运行它:
EXEC [GetDepartmentName] 1
回报:
firstname lastname
--------------------
mark abram
john adam
sean hoak
已编辑 - 决定删除一些东西