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.
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
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
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);
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