簡単な答えは、 @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
編集済み - 一部のものを削除することにしました