「SQL Server ストアド プロシージャ 作成」の版間の差分
ナビゲーションに移動
検索に移動
1行目: | 1行目: | ||
− | ==SQL Server ストアド プロシージャ 作成== | + | ==[[SQL Server ストアド プロシージャ 作成]]== |
[[SQL Server]] | [[SQL Server 2005]] | [[SQL Server ストアド プロシージャ]] | [[Transact-SQL]] | | [[SQL Server]] | [[SQL Server 2005]] | [[SQL Server ストアド プロシージャ]] | [[Transact-SQL]] | | ||
==作成== | ==作成== | ||
===[http://msdn.microsoft.com/ja-jp/library/ms187926(v=SQL.90).aspx CREATE PROCEDURE]=== | ===[http://msdn.microsoft.com/ja-jp/library/ms187926(v=SQL.90).aspx CREATE PROCEDURE]=== | ||
− | * | + | *作成には、[[Transact-SQL]] ステートメントの CREATE PROCEDURE を使用する |
====注意==== | ====注意==== | ||
− | *CREATE PROCEDURE ステートメントは、1 つのバッチ内で他の SQL ステートメントと組み合わせて使用できない | + | *CREATE PROCEDURE ステートメントは、1 つのバッチ内で他の [[SQL]] ステートメントと組み合わせて使用できない |
− | *データベースに対して | + | *データベースに対して C[[R]]EATE P[[R]]OCEDU[[R]]E 権限、スキーマに対して ALTE[[R]] 権限を所持している必要があります。 |
− | * | + | *CL[[R]] ストアド プロシージャの場合は、<method_specifier> で参照されるアセンブリを所有しているか、そのアセンブリの [[R]]EFE[[R]]ENCES 権限を所持している必要があります。 |
*スキーマ スコープが設定されたオブジェクトで、その名前は識別子の規則に従う必要があります。 | *スキーマ スコープが設定されたオブジェクトで、その名前は識別子の規則に従う必要があります。 | ||
*現在のデータベースにのみ作成することができる。 | *現在のデータベースにのみ作成することができる。 | ||
17行目: | 17行目: | ||
**[http://msdn.microsoft.com/ja-jp/library/ms179296(v=SQL.90).aspx ストアド プロシージャで指定できる、ERROR_LINE や ERROR_PROCEDURE などの、新しいエラー処理関数が導入されました。] | **[http://msdn.microsoft.com/ja-jp/library/ms179296(v=SQL.90).aspx ストアド プロシージャで指定できる、ERROR_LINE や ERROR_PROCEDURE などの、新しいエラー処理関数が導入されました。] | ||
====命名==== | ====命名==== | ||
− | <blockquote>sp_ をプレフィックスに使用してストアド | + | <blockquote>sp_ をプレフィックスに使用してストアド プロシージャを作成しないこと。[[SQL Server]] では、システム ストアド プロシージャを指定するために sp_ プレフィックスを使用しています。独自のプロシージャ名がシステム プロシージャ名と競合していると、その名前は独自のプロシージャではなく、システム プロシージャにバインドされるので、アプリケーションの機能が停止することになります。</blockquote> |
====一時ストアド プロシージャ==== | ====一時ストアド プロシージャ==== | ||
*一時テーブルと同様に、プロシージャ名にプレフィックスをつけて作成できる | *一時テーブルと同様に、プロシージャ名にプレフィックスをつけて作成できる | ||
− | *SQL Server がシャットダウンされるまで存在します。 | + | *[[SQL Server]] がシャットダウンされるまで存在します。 |
− | * | + | *CL[[R]] ストアド プロシージャを一時ストアド プロシージャとして作成することはできません。 |
{|class="wikitable" | {|class="wikitable" | ||
35行目: | 35行目: | ||
|} | |} | ||
===例=== | ===例=== | ||
− | + | [SQL Server サンプルデータベースの入手とインストール サンプルデータベースの入手とインストール] | |
====パラメータを使用しない==== | ====パラメータを使用しない==== | ||
use AdventureWorks; | use AdventureWorks; | ||
go | go | ||
− | if object_id( ' | + | if object_id( 'Human[[R]]esources.uspGetAllEmployees', 'P' ) is not null |
− | drop procedure | + | drop procedure Human[[R]]esources.uspGetAllEmployees; |
go | go | ||
− | create procedure | + | create procedure Human[[R]]esources.uspGetAllEmployees |
as | as | ||
set nocount on; | set nocount on; | ||
select LastName, FirstName, JobTitle, Department | select LastName, FirstName, JobTitle, Department | ||
− | from | + | from Human[[R]]esources.vEmployeeDepartment; |
go | go | ||
=====実行===== | =====実行===== | ||
use AdventureWorks; | use AdventureWorks; | ||
go | go | ||
− | execute | + | execute Human[[R]]esources.uspGetAllEmployees; |
go | go | ||
<blockquote>execute は、exec と省略することも、完全に省略することも可能</blockquote> | <blockquote>execute は、exec と省略することも、完全に省略することも可能</blockquote> | ||
59行目: | 59行目: | ||
use AdventureWorks; | use AdventureWorks; | ||
go | go | ||
− | if object_id( ' | + | if object_id( 'Human[[R]]esources.uspGetEmployees', 'P' ) is not null |
− | drop procedure | + | drop procedure Human[[R]]esources.uspGetEmployees; |
go | go | ||
− | create procedure | + | create procedure Human[[R]]esources.uspGetEmployees |
@LastName nvarchar(50), | @LastName nvarchar(50), | ||
@FirstName nvarchar(50) | @FirstName nvarchar(50) | ||
68行目: | 68行目: | ||
set nocount on; | set nocount on; | ||
select FirstName, LastName, JobTitle, Department | select FirstName, LastName, JobTitle, Department | ||
− | from | + | from Human[[R]]esources.vEmployeeDepartment |
where FirstName = @FirstName and LastName = @LastName; | where FirstName = @FirstName and LastName = @LastName; | ||
go | go | ||
74行目: | 74行目: | ||
use AdventureWorks; | use AdventureWorks; | ||
go | go | ||
− | execute | + | execute Human[[R]]esources.uspGetEmployees N'Ackerman',N'Pilar'; |
go | go | ||
-- Or | -- Or | ||
− | execute | + | execute Human[[R]]esources.uspGetEmployees @LastName=N'Ackerman',@FirstName=N'Pilar'; |
go | go | ||
83行目: | 83行目: | ||
use AdventureWorks; | use AdventureWorks; | ||
go | go | ||
− | if object_id( ' | + | if object_id( 'Human[[R]]esouces.uspGetEmployees2','P' ) is not null |
− | drop procedure | + | drop procedure Human[[R]]esources.uspGetEmployees2; |
go | go | ||
− | create procedure | + | create procedure Human[[R]]esources.uspGetEmployees2 |
@LastName nvarchar(50) = N'D%', | @LastName nvarchar(50) = N'D%', | ||
@FirstName nvarchar(50) = N'%' | @FirstName nvarchar(50) = N'%' | ||
92行目: | 92行目: | ||
set nocount on; | set nocount on; | ||
select FirstName, LastName, JobTitle, Department | select FirstName, LastName, JobTitle, Department | ||
− | from | + | from Human[[R]]esources.vEmployeeDepartment |
where FirstName like @FirstName and LastName like @LastName; | where FirstName like @FirstName and LastName like @LastName; | ||
go | go | ||
99行目: | 99行目: | ||
use AdventureWorks; | use AdventureWorks; | ||
go | go | ||
− | execute | + | execute Human[[R]]esources.uspGetEmployees2; |
go | go | ||
− | execute | + | execute Human[[R]]esources.uspGetEmployees2 N'Wi%' |
go | go | ||
execute HumanResources.uspGetEmployees2 N'[DC]%'; | execute HumanResources.uspGetEmployees2 N'[DC]%'; | ||
go | go | ||
− | execute | + | execute Human[[R]]esources.uspGetEmployees2 N'H%', N'S%'; |
go | go | ||
167行目: | 167行目: | ||
====[http://msdn.microsoft.com/ja-jp/library/ms189837(v=SQL.90).aspx SET NOCOUNT]==== | ====[http://msdn.microsoft.com/ja-jp/library/ms189837(v=SQL.90).aspx SET NOCOUNT]==== | ||
*ON の場合、行数は返されません。SET NOCOUNT が OFF の場合、行数が返されます。 | *ON の場合、行数は返されません。SET NOCOUNT が OFF の場合、行数が返されます。 | ||
− | *ON の場合でも、@@ | + | *ON の場合でも、@@[[R]]OWCOUNT 関数は更新されます。 |
*実際に返すデータが少量のステートメントで構成されるストアド プロシージャの場合、ネットワーク通信量が大きく減少するので、SET NOCOUNT を ON に設定するとパフォーマンスが大きく向上します。 | *実際に返すデータが少量のステートメントで構成されるストアド プロシージャの場合、ネットワーク通信量が大きく減少するので、SET NOCOUNT を ON に設定するとパフォーマンスが大きく向上します。 |
2020年2月16日 (日) 04:32時点における最新版
目次
SQL Server ストアド プロシージャ 作成
SQL Server | SQL Server 2005 | SQL Server ストアド プロシージャ | Transact-SQL |
作成
CREATE PROCEDURE
- 作成には、Transact-SQL ステートメントの CREATE PROCEDURE を使用する
注意
- CREATE PROCEDURE ステートメントは、1 つのバッチ内で他の SQL ステートメントと組み合わせて使用できない
- データベースに対して CREATE PROCEDURE 権限、スキーマに対して ALTER 権限を所持している必要があります。
- CLR ストアド プロシージャの場合は、<method_specifier> で参照されるアセンブリを所有しているか、そのアセンブリの REFERENCES 権限を所持している必要があります。
- スキーマ スコープが設定されたオブジェクトで、その名前は識別子の規則に従う必要があります。
- 現在のデータベースにのみ作成することができる。
指定内容
- 任意の入力パラメータと、出力パラメータ。
- プログラミング ステートメント。
- ステータス値。
- エラー処理ステートメント。
命名
<blockquote>sp_ をプレフィックスに使用してストアド プロシージャを作成しないこと。SQL Server では、システム ストアド プロシージャを指定するために sp_ プレフィックスを使用しています。独自のプロシージャ名がシステム プロシージャ名と競合していると、その名前は独自のプロシージャではなく、システム プロシージャにバインドされるので、アプリケーションの機能が停止することになります。</blockquote>
一時ストアド プロシージャ
- 一時テーブルと同様に、プロシージャ名にプレフィックスをつけて作成できる
- SQL Server がシャットダウンされるまで存在します。
- CLR ストアド プロシージャを一時ストアド プロシージャとして作成することはできません。
一時ストアド プロシージャ | プレフィックス |
---|---|
プライベート一時ストアド プロシージャ | # |
グローバル一時ストアド プロシージャ | ## |
例
[SQL Server サンプルデータベースの入手とインストール サンプルデータベースの入手とインストール]
パラメータを使用しない
use AdventureWorks; go if object_id( 'HumanResources.uspGetAllEmployees', 'P' ) is not null drop procedure HumanResources.uspGetAllEmployees; go create procedure HumanResources.uspGetAllEmployees as set nocount on; select LastName, FirstName, JobTitle, Department from HumanResources.vEmployeeDepartment; go
実行
use AdventureWorks; go execute HumanResources.uspGetAllEmployees; go
<blockquote>execute は、exec と省略することも、完全に省略することも可能</blockquote>
パラメータを指定する
use AdventureWorks; go if object_id( 'HumanResources.uspGetEmployees', 'P' ) is not null drop procedure HumanResources.uspGetEmployees; go create procedure HumanResources.uspGetEmployees @LastName nvarchar(50), @FirstName nvarchar(50) as set nocount on; select FirstName, LastName, JobTitle, Department from HumanResources.vEmployeeDepartment where FirstName = @FirstName and LastName = @LastName; go
実行
use AdventureWorks; go execute HumanResources.uspGetEmployees N'Ackerman',N'Pilar'; go -- Or execute HumanResources.uspGetEmployees @LastName=N'Ackerman',@FirstName=N'Pilar'; go
ワイルドカード パラメータを指定
use AdventureWorks; go if object_id( 'HumanResouces.uspGetEmployees2','P' ) is not null drop procedure HumanResources.uspGetEmployees2; go create procedure HumanResources.uspGetEmployees2 @LastName nvarchar(50) = N'D%', @FirstName nvarchar(50) = N'%' as set nocount on; select FirstName, LastName, JobTitle, Department from HumanResources.vEmployeeDepartment where FirstName like @FirstName and LastName like @LastName; go
実行
<blockquote>様々な組み合わせで実行できる</blockquote>
use AdventureWorks; go execute HumanResources.uspGetEmployees2; go execute HumanResources.uspGetEmployees2 N'Wi%' go execute HumanResources.uspGetEmployees2 N'[DC]%'; go execute HumanResources.uspGetEmployees2 N'H%', N'S%'; go
OUTPUT パラメータの使用
OUTPUT
use AdventureWorks; go if object_id( 'Production.uspGetList', 'P' ) is not null drop procedure Production.uspGetList; go create procedure Production.uspGetList @Product varchar(40), @MaxPrice money, @ComparePrice money output, @ListPrice money output as set nocount on; select p.[Name] as Product, p.ListPrice as 'List Price' from Production.Product as p inner join Production.ProductSubcategory as s on p.ProductSubcategoryID = s.ProductSubcategoryID where s.[Name] like @Product and p.ListPrice < @MaxPrice; set @ListPrice = (select max(p.ListPrice) from Production.Product as p inner join Production.ProductSubcategory as s on p.ProductSubcategoryID = s.ProductSubcategoryID where s.[Name] like @Product and p.ListPrice < @MaxPrice ); set @ComparePrice = @MaxPrice; go
実行
<blockquote>プロシージャの作成中および変数の使用中に、OUTPUT 変数を定義する必要があります。パラメータ名と変数名は一致する必要はありませんが、データ型とパラメータの位置は一致する必要があります</blockquote>
use AdventureWorks; go declare @ComparePrice money, @Cost money execute Production.uspGetList '%Bikes%', 700, @ComparePrice output, @Cost output if @Cost <= @ComparePrice begin print 'These products can be purchased for less than $' + rtrim(cast(@ComparePrice as varchar(20)))+'.' end else print 'The prices for all products in this category exceed $' + rtrim(cast(@ComparePrice as varchar(20)))+'.'
- $700 より安い Adventure Works 製品 (バイク) の一覧
- メッセージ
- $300 より安い Adventure Works 製品 (バイク) の一覧
- メッセージ
参考
SET NOCOUNT
- ON の場合、行数は返されません。SET NOCOUNT が OFF の場合、行数が返されます。
- ON の場合でも、@@ROWCOUNT 関数は更新されます。
- 実際に返すデータが少量のステートメントで構成されるストアド プロシージャの場合、ネットワーク通信量が大きく減少するので、SET NOCOUNT を ON に設定するとパフォーマンスが大きく向上します。
© 2006 矢木浩人