-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

ここでいくつかのことが起こっています。これは、ここ数日でこれに関連してあなたが開いた4番目の質問であるため、私が行ったことを正確に説明し、あなたを助け、前進する方法を説明するよう努めます.

OK - @Aaron Bertrand のストアド プロシージャは優れています。彼はあなたが質問で提供したクエリを受け取り、それを機能させ、あなたの質問に素晴らしい答えをくれました. しかし、あなたの質問にはいくつかの問題があると思います。 良い答えを得るには、良い質問をする必要があります

私はあなたがすでに尋ねた他の関連する質問の1つに行き、テーブル構造と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'.

結合を変更する必要があることは、OTHER の質問のテーブル構造からわかります。

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からすぐに変更され、出力変数はありません-それは私の答えの最初の最初のものと同じです。

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' (management studio) を使用してSSMSで実行します。

EXEC [GetDepartmentName] 1

戻り値:

firstname   lastname
--------------------
mark    abram
john    adam
sean    hoak

編集済み - 一部のものを削除することにしました

于 2012-06-17T14:46:15.320 に答える
0

実行時に select が機能すると仮定すると、つまり、結合が正しく、データが返されると仮定すると、以下の create procedure スクリプトが必要なことを実行するはずです。

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 ステートメントによって返されるものはすべて、結果に表示されます。

Web ページからプロシージャを実行してみますが、SQL プロファイラーを使用して、@VID パラメーターが期待どおりに渡されるかどうかを確認してください。

于 2012-06-16T20:21:35.407 に答える