2017-09-20 3 views
3

J'ai une table simple avec des colonnes - identifiant, nom et salaire. Je veux obtenir le nom, le salaire et le salaire annuel par identifiant en utilisant une procédure stockée.Comment utiliser le paramètre de sortie avec d'autres noms de colonnes dans SQL Server

Je pensais que la création d'une procédure stockée simple comme ceci:

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

Mais j'obtiens une erreur:

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

Si cette qs est déjà demandé s'il vous plaît me donner le lien et je Je vais supprimer ce qs. J'ai cherché mais je pense que le mot clé me ​​manque. Merci

+0

Avez-vous essayé de rechercher l'erreur sur Internet? – etsa

+0

Le message d'erreur indiquant clairement que vous ne pouvez pas faire Assign & Selecting dans une seule instruction. –

+1

Comme l'erreur l'indique, vous ne pouvez pas combiner les deux opérations, mais dans ce cas, il semble que l'utilisation d'un paramètre de sortie soit superflue. Puisque tout ce qui appelle la procédure est susceptible de lire les deux premières colonnes, pourquoi ne pas simplement utiliser une troisième colonne "AnnualSalary", et que tout ce qui l'appelle obtient le salaire annuel via ce paramètre plutôt qu'un paramètre de sortie? – GarethD

Répondre

0

Vous avez des choses mélangées de sorte que vous devez choisir entre 2 possibilités

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 

ou cette

CREATE PROCEDURE spGetDetails 
    @id int 
AS 
BEGIN 
    set nocount on 

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

Oui, je dois soit sélectionner tous en tant que colonnes ou utiliser le paramètre de sortie pour toutes les colonnes. – Kibria

2

Vous n'avez pas besoin d'un paramètre OUTPUT. Vous pouvez simplement interroger comme ça -

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

En fait, j'essayais d'utiliser le paramètre de sortie, je sais que l'utilisation de l'alias peut me donner le même résultat. – Kibria

+0

Si vous avez vraiment besoin d'utiliser un paramètre 'OUTPUT', alors vous aurez besoin d'obtenir la valeur pour cela dans une requête indépendante. Vous ne pouvez pas sélectionner d'autres colonnes et remplir ce paramètre dans la même requête – Raj

+1

seule chose qui manque est l'instruction 'set nocount on' – GuidoG

-1

Vous devez stocker les données et séparer les opérations (comme le message d'erreur expliquant):

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;