2017-09-20 8 views
3

私は列(id、name、salary)を持つ単純なテーブルを持っています。SQL Serverで他の列名と出力パラメータを使用する方法

ストアドプロシージャを使用してIDで名前、給与、年俸を取得したいとします。

私はこのような単純なストアドプロシージャを作成するので考えた:

CREATE PROCEDURE spGetDetails 
    @id int, 
    @annualSal int out 
AS 
BEGIN 
    SELECT 
     name, salary, 
     @annualSal = (salary * 12) 
    FROM 
     tblPrac 
    WHERE 
     id = @id 
END 

しかし、私はエラーを取得しています:

A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations

このQSはすでに私のリンクを提供し、I下さい頼まれた場合qsを削除します。私は検索したが、私はキーワードが足りないと思う。ありがとう

+0

インターネットでエラーを検索しようとしましたか? – etsa

+0

エラーメッセージでは、1つのステートメントで代入と選択を行うことはできないことを明確に示しています。 –

+1

エラーが示すように、2つの操作を組み合わせることはできませんが、この場合、出力パラメータのかなり不必要な使用のようです。プロシージャを呼び出すものはどれも最初の2つの列を読み込む可能性が高いので、3番目の列「AnnualSalary」を使用するだけでなく、出力パラメータではなく、これを介して年間給料を取得するとしているものは何ですか? – GarethD

答えて

0

あなたがものを持っているあなたが間に選択する必要がありますように混合します2つの可能性

CREATE PROCEDURE spGetDetails 
    @id int, 
    @name varchar(100) out, 
    @salary decimal(16,2) out, 
    @annualSal decimal(16,2) out 
AS 
BEGIN 
    set nocount on 

    SELECT @name = name, 
      @salary = salary, 
      @annualSal = (salary * 12) 
    FROM tblPrac 
    WHERE id = @id 
END 

またはこの

CREATE PROCEDURE spGetDetails 
    @id int 
AS 
BEGIN 
    set nocount on 

    SELECT name, 
      salary, 
      (salary * 12) as anualSal 
    FROM tblPrac 
    WHERE id = @id 
END 
+0

はいすべてを列として選択するか、すべての列に対して出力パラメータを使用する必要があります。 – Kibria

2

OUTPUTパラメータは不要です。あなたは、単にこのように問い合わせることができます -

CREATE PROCEDURE spGetDetails 
    @id int 
    AS 
    BEGIN 
    SET NOCOUNT ON 
    SELECT Name, Salary, (Salary*12) AS AnnualSalary FROM tblPrac WHERE id = @id 
    END 
+0

実際には、私は出力パラメータを使用しようとしていた、私は別名を使用して私に同じ結果を与えることが知っている。 – Kibria

+0

本当に 'OUTPUT'パラメータを使用する必要がある場合は、独立したクエリでその値を取得する必要があります。他のカラムを選択することはできません。同じクエリ内にそのパラメータを設定することはできません。 – Raj

+1

ここで欠けているのは、 'set nocount on'ステートメントです。 – GuidoG

-1

あなたは(エラーメッセージが説明されたように)データを格納し、操作を分離する必要があります。

CREATE PROCEDURE spGetDetails 
(
    @id int, 
    @annualSal int out 
) 
AS 
BEGIN; 

    SET NOCOUNT ON; 

    DECLARE @DataSource TABLE 
    (
     [name] VARCHAR(12) 
     ,[salary] DECIMAL(9,2) 
    ); 

    INSERT INTO @DataSource ([name], [salary]) 
    SELECT name, salary 
    FROM tblPrac 
    WHERE id = @id; 

    SELECT [name] 
      ,[salary] 
    FROM @DataSource; 

    SELECT @annualSal = 12 * [salary] 
    FROM @DataSource; 

    SET NOCOUNT OFF; 

    RETURN; 
END; 
関連する問題