web-dev-qa-db-fra.com

Écriture d'une procédure stockée T-SQL pour recevoir 4 nombres et les insérer dans une table

J'ai besoin d'écrire une procédure stockée pour recevoir 4 numéros et les insérer dans un tableau. Voici ce que j'ai développé jusqu'à présent:

Declare   
@1  Int = 10,
@2  Int = 20,
@3  Int = 30,
@4  Int = 40


Create table #Temp(Num int)
Declare @I char(1) = 1


 While (@I <= 4)
   Begin

         Insert Into #Temp
         Select @I

     SET @I +=1
   end


Select * from #Temp
Drop table #Temp

Je sais que je peux insérer directement et statiquement les entrées dans le tableau, mais je veux juste savoir s'il existe une meilleure façon de le faire? Je voulais utiliser une instruction while mais le problème est que les nombres pour la variable (I) sont insérés dans la table !! Je veux dire que la sortie est 1,2,3,4; ce que je veux c'est 10,20,30,40.

5
Pantea Tourang

Vous pouvez également utiliser un type de paramètre de valeur table dans la procédure stockée et transmettre des nombres via ce tvp.

Créez le type

CREATE TYPE GetNumbers AS TABLE   
( Numbers INT );  
GO  

Créez la procédure

CREATE PROCEDURE dbo.InsertNumbers  
@GetNumbers GetNumbers READONLY  
AS   
SET NOCOUNT ON;

CREATE TABLE #Temp(Num int);
INSERT INTO  #Temp(Num)
SELECT Numbers
FROM  @GetNumbers;  
SELECT * FROM #Temp;
DROP TABLE #Temp;
GO  

L'insertion dans la table temporaire n'est pas vraiment nécessaire ici, seulement pour la garder la même que la question.

Remplissez une variable avec des données et appelez la procédure

/* Declare a variable that references the type. */  
DECLARE @GetNumbers AS GetNumbers;  

/* Add data to the table variable. */  
INSERT INTO @GetNumbers (Numbers)  
VALUES(10),(20),(30),(40);

/* Pass the table variable data to a stored procedure. */  
EXEC InsertNumbers @GetNumbers;  

L'exemple utilisé et plus sur tvp's ici

11
Randi Vertongen
Declare   
@1  Int = 10,
@2  Int = 20,
@3  Int = 30,
@4  Int = 40

Create table #Temp(Num int)

--1st way
INSERT #Temp(Num)
SELECT @1
UNION ALL
SELECT @2
UNION ALL
SELECT @3
UNION ALL
SELECT @4


SELECT * FROM #Temp

TRUNCATE TABLE #Temp

--2nd way    
INSERT #Temp(Num)
VALUES
    (@1),
    (@2),
    (@3),
    (@4)

SELECT * FROM #Temp

DROP TABLE #Temp
7
Denis Rubashkin
CREATE PROCEDURE dbo.InsertFourValues (@I1 int, @I2 int, @I3 int, @I4 int)
AS

BEGIN
  --the table below must already exist
  INSERT INTO dbo.MyTable (MyIntColumn)
  VALUES (@I1), (@I2), (@I3), (@I4);

END

Maintenant, vous l'appelez simplement en utilisant vos valeurs:

EXEC dbo.InsertFourValues (10, 20, 30, 40);
5
Queue Mann

Le meilleur pari est de le faire avec une instruction d'insertion statique si vous voulez vraiment le faire via une boucle, vous pouvez utiliser la valeur de @I pour déterminer quelle valeur passer dans l'instruction d'insertion à l'aide d'une instruction case serait la meilleure voie pour cette

C'EST À DIRE.

While (@I <= 4)
   Begin
         Insert Into #Temp
         Select case @I when 1 then @1 
            when 2 then @2
            -- etc
            End     
     SET @I +=1
   end
2
saihtam8