SQL Server 2005 のストアドプロシージャから SELECT する方法

2024-04-02

SQL Server 2005 のストアドプロシージャから SELECT する方法

方法

  1. ストアドプロシージャの作成
CREATE PROCEDURE [dbo].[GetCustomers]
AS
BEGIN
  SELECT *
  FROM Customers
END
  1. SELECT ステートメントの実行
EXEC [dbo].[GetCustomers]

この例では、GetCustomers という名前のストアドプロシージャを作成します。このストアドプロシージャは Customers テーブルからすべてのデータを選択します。

SELECT ステートメントでストアドプロシージャからデータを抽出する方法はいくつかあります。

  • *SELECT : すべての列を選択します。
  • WHERE 句: 条件に基づいてデータを選択します。
  • ORDER BY 句: データを並べ替えます。

例:

  • すべての列を選択して、名前で昇順に並べ替える
EXEC [dbo].[GetCustomers]
ORDER BY Name ASC
EXEC [dbo].[GetCustomers]
SELECT Name, Age
ORDER BY Age DESC
EXEC [dbo].[GetCustomers]
WHERE Country = 'Japan'

ストアドプロシージャは、パラメータを受け取ることができます。パラメータは、ストアドプロシージャの動作を制御するために使用できます。

CREATE PROCEDURE [dbo].[GetCustomersByCountry]
@Country VARCHAR(50)
AS
BEGIN
  SELECT *
  FROM Customers
  WHERE Country = @Country
END

このストアドプロシージャは、Country パラメータを受け取ります。このパラメータは、Customers テーブルから選択する国の名前を指定するために使用されます。

ストアドプロシージャを実行するには、EXEC ステートメントを使用します。

EXEC [dbo].[GetCustomersByCountry]
@Country = 'Japan'

この例では、GetCustomersByCountry ストアドプロシージャを実行します。Country パラメータは 'Japan' に設定されています。




USE AdventureWorks2019

CREATE PROCEDURE [dbo].[GetProductsByCategory]
@CategoryName VARCHAR(50)
AS
BEGIN
  SELECT 
    ProductID,
    Name,
    ProductCategory.Name AS CategoryName,
    Manufacturer,
    ListPrice,
    QuantityInStock
  FROM Production.Product
  INNER JOIN Production.ProductCategory ON Product.ProductCategoryID = ProductCategory.ProductCategoryID
  WHERE ProductCategory.Name = @CategoryName
END
EXEC [dbo].[GetProductsByCategory]
@CategoryName = 'Bikes'

結果

ProductID | Name        | CategoryName | Manufacturer | ListPrice | QuantityInStock
----------+------------+-------------+-------------+-----------+-----------------
717       | Touring Bike | Bikes       | Trek        | 807.99   | 23
720       | Road Bike   | Bikes       | Cannondale  | 1599.99  | 12
721       | Mountain Bike | Bikes       | Specialized | 2149.99  | 10
EXEC [dbo].[GetProductsByCategory]
@CategoryName = 'Bikes'
ORDER BY ListPrice ASC
EXEC [dbo].[GetProductsByCategory]
@CategoryName = 'Bikes'
SELECT ProductID, Name
ORDER BY Name DESC
EXEC [dbo].[GetProductsByCategory]
@CategoryName = 'Bikes'
WHERE Manufacturer = 'Trek'

ストアドプロシージャは、複数のパラメータを受け取ることができます。

CREATE PROCEDURE [dbo].[GetProductsByCategoryAndPrice]
@CategoryName VARCHAR(50),
@MinPrice DECIMAL(18,2),
@MaxPrice DECIMAL(18,2)
AS
BEGIN
  SELECT 
    ProductID,
    Name,
    ProductCategory.Name AS CategoryName,
    Manufacturer,
    ListPrice,
    QuantityInStock
  FROM Production.Product
  INNER JOIN Production.ProductCategory ON Product.ProductCategoryID = ProductCategory.ProductCategoryID
  WHERE ProductCategory.Name = @CategoryName
  AND ListPrice BETWEEN @MinPrice AND @MaxPrice
END
  • CategoryName: カテゴリ名
  • MinPrice: 最低価格
EXEC [dbo].[GetProductsByCategoryAndPrice]
@CategoryName = 'Bikes',
@MinPrice = 1000,
@MaxPrice = 2000

この例では、GetProductsByCategoryAndPrice ストアドプロシージャを実行します。

  • CategoryName パラメータは 'Bikes' に設定されています。
  • MinPrice パラメータは 1000 に設定されています。
ProductID | Name        | CategoryName | Manufacturer | ListPrice | QuantityInStock
----------+------------+-------------+-------------+-----------+-----------------
720       | Road Bike   | Bikes       | Cannondale  | 1599.99  | 12



SELECT ステートメントを使用してストアドプロシージャからデータを抽出する他の方法

OUTPUT 句を使用して、ストアドプロシージャからデータをクライアントアプリケーションに送信できます。

CREATE PROCEDURE [dbo].[GetProductsByCategory]
@CategoryName VARCHAR(50)
AS
BEGIN
  SELECT 
    ProductID,
    Name,
    ProductCategory.Name AS CategoryName,
    Manufacturer,
    ListPrice,
    QuantityInStock
  FROM Production.Product
  INNER JOIN Production.ProductCategory ON Product.ProductCategoryID = ProductCategory.ProductCategoryID
  WHERE ProductCategory.Name = @CategoryName
  
  OUTPUT 
    ProductID,
    Name,
    CategoryName,
    Manufacturer,
    ListPrice,
    QuantityInStock
END

このストアドプロシージャは、GetProductsByCategory という名前のストアドプロシージャと同じですが、OUTPUT 句を使用してデータをクライアントアプリケーションに送信します。

EXEC [dbo].[GetProductsByCategory]
@CategoryName = 'Bikes'

ProductID | Name        | CategoryName | Manufacturer | ListPrice | QuantityInStock
----------+------------+-------------+-------------+-----------+-----------------
717       | Touring Bike | Bikes       | Trek        | 807.99   | 23
720       | Road Bike   | Bikes       | Cannondale  | 1599.99  | 12
721       | Mountain Bike | Bikes       | Specialized | 2149.99  | 10

TEMPORARY TABLE を使用して、ストアドプロシージャからデータを抽出できます。

CREATE PROCEDURE [dbo].[GetProductsByCategory]
@CategoryName VARCHAR(50)
AS
BEGIN
  CREATE TABLE #Products (
    ProductID INT,
    Name VARCHAR(50),
    CategoryName VARCHAR(50),
    Manufacturer VARCHAR(50),
    ListPrice DECIMAL(18,2),
    QuantityInStock INT
  )

  INSERT INTO #Products
  SELECT 
    ProductID,
    Name,
    ProductCategory.Name AS CategoryName,
    Manufacturer,
    ListPrice,
    QuantityInStock
  FROM Production.Product
  INNER JOIN Production.ProductCategory ON Product.ProductCategoryID = ProductCategory.ProductCategoryID
  WHERE ProductCategory.Name = @CategoryName

  SELECT *
  FROM #Products

  DROP TABLE #Products
END
EXEC [dbo].[GetProductsByCategory]
@CategoryName = 'Bikes'

ProductID | Name        | CategoryName | Manufacturer | ListPrice | QuantityInStock
----------+------------+-------------+-------------+-----------+-----------------
717       | Touring Bike | Bikes       | Trek        | 807.99   | 23
720       | Road Bike   | Bikes       | Cannondale  | 1599.99  | 12
721       | Mountain Bike | Bikes       | Specialized | 2149.99  | 10
CREATE PROCEDURE [dbo].[GetProductsByCategory]
@CategoryName VARCHAR(50)
AS
BEGIN
  DECLARE @Cursor CURSOR
  DECLARE @ProductID INT
  DECLARE @Name VARCHAR(50)
  DECLARE @CategoryName VARCHAR(50)
  DECLARE @Manufacturer VARCHAR(50)
  DECLARE @ListPrice DECIMAL(18,2)
  DECLARE @QuantityInStock INT

  SET @Cursor = CURSOR FOR
  SELECT 
    ProductID,
    Name,
    ProductCategory.Name AS CategoryName,
    Manufacturer,
    ListPrice,
    QuantityInStock
  FROM Production.Product
  INNER JOIN Production.ProductCategory ON Product.ProductCategoryID = ProductCategory.ProductCategoryID
  WHERE ProductCategory.Name = @CategoryName

  OPEN @Cursor

sql sql-server sql-server-2005


inserted と deleted テーブルを使用する

トリガーが挿入または更新されたかどうかを判断するには、いくつかの方法があります。inserted と deleted テーブルを使用するSQL Server は、トリガーがアクティブになったときに、inserted と deleted という 2 つの特殊なテーブルを自動的に作成します。これらのテーブルには、挿入または更新、または削除されたデータに関する情報が含まれています。...


MySQLで2つの日付の差を計算する方法

MySQLで2つの日付の差を計算するには、いくつかの方法があります。それぞれ異なる用途や利点があるので、状況に合わせて最適な方法を選択することが重要です。DATEDIFF関数は、2つの日付の差を日数で返す最もシンプルな方法です。この例では、'2023-11-14' から '2023-10-05' までの日数が40であることが返されます。...


SQLでINSERT ... SELECTを使って列名を自由にマッピングして挿入する方法

列名を明示的に指定する最も基本的な方法は、INSERT INTO文で挿入先の列名を明示的に指定する方法です。構文は以下の通りです。例:この方法では、挿入先の列名とデータの順番を一致させる必要があります。サブクエリを使用すると、列名の順序を気にせずにデータを挿入することができます。構文は以下の通りです。...