-5

我有这个要用作存储过程的查询:

  SELECT ISNULL(P.firstname, s.firstname) AS Expr1,ISNULL(P.lastname,
  s.lastname) AS Expr2 FROM comment AS C LEFT OUTER JOIN professor AS P ON P.ID =   

  C.PID LEFT OUTER JOIN student AS s ON s.ID = C.SID

  WHERE (C.VID = @VID)

它应该返回 Expr1 和 Expr2 的值

我试图声明输入和输出,但没有运气

请帮忙

编辑 :

  CREATE PROCEDURE [dbo].[GetDepartmentName]
  @ID int,
  @fName varchar(50) OUTPUT
   @lName varchar(50) OUTPUT
  AS


SELECT @fName=COALESCE(p.firstname, s.firstname)   @lName=COALESCE(p.lastname,     

   s.lastname)as 
  FROM comment c
  LEFT JOIN Professor p
    ON c.pid = p.id
  LEFT JOIN Student s
    ON c.sid = s.id
 WHERE c.vid = @ID
4

3 回答 3

5
ALTER PROCEDURE [dbo].[GetDepartmentName]
  @ID    INT,
  @fName varchar(50) OUTPUT, -- added missing comma here
  @lName varchar(50) OUTPUT
AS
BEGIN
  SET NOCOUNT ON;

  SELECT  
    @fName = COALESCE(p.firstname, s.firstname), -- added missing comma here
    @lName = COALESCE(p.lastname,  s.lastname)   -- removed strange "as" here 
  FROM dbo.comment AS c
  LEFT OUTER JOIN dbo.Professor AS p
    ON c.pid = p.id
  LEFT OUTER JOIN dbo.Student AS s
    ON c.sid = s.id
  WHERE c.vid = @ID;
END
GO
于 2012-06-16T20:21:24.063 回答
2

简短的答案是下面的存储过程,从@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

已编辑 - 决定删除一些东西

于 2012-06-17T14:46:15.320 回答
0

假设您的选择在您运行时有效,即连接是正确的并且这将返回数据,那么下面的创建过程脚本应该可以满足您的需求。

CREATE PROCEDURE uspYourProcedureName 
  @VID INT
  AS 
  SET NOCOUNT ON;

  SELECT ISNULL(P.firstname, s.firstname) AS Expr1,
         ISNULL(P.lastname, s.lastname) AS Expr2 
  FROM   comment AS C 
         LEFT OUTER JOIN professor AS P ON P.ID = C.PID 
         LEFT OUTER JOIN student AS s ON s.ID = C.SID
  WHERE (C.VID = @VID)

如果您只需要返回 Expr1 和 Expr2 值,则无需像在编辑中那样将它们定义为 OUTPUT 参数。select 语句返回的任何内容都将出现在您的结果中。

尝试从网页运行该过程,但使用 SQL Profiler 查看您的 @VID 参数是否按预期传递。

于 2012-06-16T20:21:35.407 回答