web-dev-qa-db-ja.com

4つの数値を受け取り、それらをテーブルに挿入するT-SQLストアドプロシージャを作成する

4つの数値を受け取り、それらをテーブルに挿入するストアドプロシージャを作成する必要があります。これは私がこれまでに開発したものです:

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

入力を直接静的にテーブルに挿入できることはわかっていますが、それを行うためのより良い方法があるかどうかを知りたいだけです。 whileステートメントを使用したかったのですが、問題は(I)変数の数値がテーブルに挿入されていることです!!つまり、出力は1、2、3、4です。私が欲しいのは10、20、30、40です。

5
Pantea Tourang

また、ストアドプロシージャでテーブル値パラメータータイプを使用して、このtvpを通じて数値を渡すこともできます

タイプを作成します

CREATE TYPE GetNumbers AS TABLE   
( Numbers INT );  
GO  

プロシージャを作成します

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  

一時テーブルへの挿入はここでは実際には必要ありません。質問と同じに保つためにのみ行われます。

変数をデータで満たし、プロシージャを呼び出します

/* 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;  

Tvpの here で使用されている例など

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

今、あなたはあなたの値を使ってそれを呼び出すだけです:

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

最善の策は、静的なInsertステートメントでそれを実行することです。ループを介して本当に実行したい場合は、@ Iの値を使用して、caseステートメントを使用してinsertステートメントに渡す値を決定し、それ

I.E.

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