5

私はストアドプロシージャにまったく慣れていません。今回は、MS SQL でストアド プロシージャを作成する必要があります。

次のテーブルがあるとしましょう。

     Table name: ListOfProducts  
      --------------------------
       SomeID, ProductID  

         34, 4
         35, 8
         35, 11

SomeID を渡すにはどうすればよいですか。この SomeID を使用して、テーブル ListOfProducts からレコードセットを選択します。次に、このレコード セットをループします。

SomeID = 35 を渡すとしましょう。

したがって、レコード セットは SomeID 35 の 2 つのレコードを返します。ループでは、ProductID 8 と 11 を取得し、別のテーブルから別の選択を行うために使用されます。

ストアド プロシージャは、2 番目の選択からの結果を返す必要があります。

MS SQLストアドプロシージャでこれを行うにはどうすればよいですか?

初心者の質問で申し訳ありません。助けてくれてありがとう。

4

5 に答える 5

8

レコードをループしたい場合。あなたは次のようにすることができます:

--Container to Insert Id which are to be iterated
Declare @temp1 Table
(
  tempId int
)
--Container to Insert records in the inner select for final output
Declare @FinalTable  Table
(
  Id int,
  ProductId int
)

Insert into @temp1 
Select Distinct SomeId From YourTable

-- Keep track of @temp1 record processing
Declare @Id int
While((Select Count(*) From @temp1)>0)
Begin
   Set @Id=(Select Top 1 tempId From @temp1)

   Insert Into @FinalTable 
   Select SomeId,ProductId From ListOfProducts Where Id=@Id

   Delete @temp1 Where tempId=@Id
End

Select * From @FinalTable
于 2013-03-08T06:45:50.757 に答える
2

セット全体では実行できないアクションを製品に対して実行する必要がない場合は、明示的なループを記述してもおそらく意味がありません。SQL Server は、このようなことを単独でより適切に処理できます。あなたのテーブルがどのように見えるかはわかりませんが、もっと似たものを試してみてください。

CREATE PROC dbo.yourProcName 
   @SomeID int
AS 
BEGIN
    SELECT
        P.ProductId,
        P.ProductName
    FROM
        Product P
        JOIN 
            ListOfProducts LOP
            ON LOP.ProductId = P.ProductId
    WHERE
        LOP.SomeId = @SomeID 
END
于 2013-03-08T11:43:46.310 に答える
0

WHILEループおよびBREAK/CONTINUEキーワードでオプションを使用できます

CREATE PROC dbo.yourProcName
@SomeID int
AS
BEGIN
  IF OBJECT_ID('tempdb.dbo.#resultTable') IS NOT NULL DROP TABLE dbo.#resultTable
  CREATE TABLE dbo.#resultTable
   (Col1 int, Col2 int)  
  DECLARE @ProductID int = 0
  WHILE(1=1)
    BEGIN
      SELECT @ProductID = MIN(ProductID) 
      FROM ListOfProducts 
      WHERE SomeID = @SomeID AND ProductID > @ProductID

      IF @ProductID IS NULL
      BREAK
      ELSE

      INSERT dbo.#resultTable
      SELECT Col1, Col2
      FROM dbo.yourSearchTable
      WHERE ProductID = @ProductID

      CONTINUE      
    END
  SELECT *
  FROM dbo.#resultTable 
END    

SQLFiddleのデモ

于 2013-03-08T07:30:05.900 に答える
0

次のようにします。

Declare @ID int

SET @ID = 35

SELECT
   p.SomeID
  ,p.ProductID
 FROM ListOfProducts p
  WHERE p.SomeID = @ID
 -----------------------
   --Or if you have to join to get it
  Declare @ID int

  SET @ID = 35

    SELECT
      c.SomeID
      ,p.ProductID
      ,p.ProductName

    FROM ListOfProducts p
    INNER JOIN categories c on p.ProductID = c.SomeID
    WHERE p.SomeID = @ID
于 2013-03-08T04:45:49.527 に答える