==[[SQL Server ストアド プロシージャ 作成]]==
[[SQL Server]] | [[SQL Server 2005]] | [[SQL Server ストアド プロシージャ]] | [[Transact-SQL]] |
==作成==
===[http://msdn.microsoft.com/ja-jp/library/ms187926(v=SQL.90).aspx CREATE PROCEDURE]===
*作成には、Transact作成には、[[Transact-SQL ]] ステートメントの CREATE PROCEDURE を使用する
====注意====
*CREATE PROCEDURE ステートメントは、1 つのバッチ内で他の [[SQL ]] ステートメントと組み合わせて使用できない*データベースに対して CREATE PROCEDURE C[[R]]EATE P[[R]]OCEDU[[R]]E 権限、スキーマに対して ALTER ALTE[[R]] 権限を所持している必要があります。*CLR CL[[R]] ストアド プロシージャの場合は、<method_specifier> で参照されるアセンブリを所有しているか、そのアセンブリの REFERENCES [[R]]EFE[[R]]ENCES 権限を所持している必要があります。
*スキーマ スコープが設定されたオブジェクトで、その名前は識別子の規則に従う必要があります。
*現在のデータベースにのみ作成することができる。
**[http://msdn.microsoft.com/ja-jp/library/ms179296(v=SQL.90).aspx ストアド プロシージャで指定できる、ERROR_LINE や ERROR_PROCEDURE などの、新しいエラー処理関数が導入されました。]
====命名====
<blockquote>sp_ をプレフィックスに使用してストアド プロシージャを作成しないこと。SQL プロシージャを作成しないこと。[[SQL Server ]] では、システム ストアド プロシージャを指定するために sp_ プレフィックスを使用しています。独自のプロシージャ名がシステム プロシージャ名と競合していると、その名前は独自のプロシージャではなく、システム プロシージャにバインドされるので、アプリケーションの機能が停止することになります。</blockquote>
====一時ストアド プロシージャ====
*一時テーブルと同様に、プロシージャ名にプレフィックスをつけて作成できる
*[[SQL Server ]] がシャットダウンされるまで存在します。*CLR CL[[R]] ストアド プロシージャを一時ストアド プロシージャとして作成することはできません。
{|class="wikitable"
|}
===例===
[[SQL Server サンプルデータベースの入手とインストール サンプルデータベースの入手とインストール]] |
====パラメータを使用しない====
use AdventureWorks;
go
if object_id( 'HumanResourcesHuman[[R]]esources.uspGetAllEmployees', 'P' ) is not null drop procedure HumanResourcesHuman[[R]]esources.uspGetAllEmployees;
go
create procedure HumanResourcesHuman[[R]]esources.uspGetAllEmployees
as
set nocount on;
select LastName, FirstName, JobTitle, Department
from HumanResourcesHuman[[R]]esources.vEmployeeDepartment;
go
=====実行=====
use AdventureWorks;
go
execute HumanResourcesHuman[[R]]esources.uspGetAllEmployees;
go
<blockquote>execute は、exec と省略することも、完全に省略することも可能</blockquote>
use AdventureWorks;
go
if object_id( 'HumanResourcesHuman[[R]]esources.uspGetEmployees', 'P' ) is not null drop procedure HumanResourcesHuman[[R]]esources.uspGetEmployees;
go
create procedure HumanResourcesHuman[[R]]esources.uspGetEmployees
@LastName nvarchar(50),
@FirstName nvarchar(50)
set nocount on;
select FirstName, LastName, JobTitle, Department
from HumanResourcesHuman[[R]]esources.vEmployeeDepartment
where FirstName = @FirstName and LastName = @LastName;
go
use AdventureWorks;
go
execute HumanResourcesHuman[[R]]esources.uspGetEmployees N'Ackerman',N'Pilar';
go
-- Or
execute HumanResourcesHuman[[R]]esources.uspGetEmployees @LastName=N'Ackerman',@FirstName=N'Pilar';
go
use AdventureWorks;
go
if object_id( 'HumanResoucesHuman[[R]]esouces.uspGetEmployees2','P' ) is not null drop procedure HumanResourcesHuman[[R]]esources.uspGetEmployees2;
go
create procedure HumanResourcesHuman[[R]]esources.uspGetEmployees2
@LastName nvarchar(50) = N'D%',
@FirstName nvarchar(50) = N'%'
set nocount on;
select FirstName, LastName, JobTitle, Department
from HumanResourcesHuman[[R]]esources.vEmployeeDepartment
where FirstName like @FirstName and LastName like @LastName;
go
use AdventureWorks;
go
execute HumanResourcesHuman[[R]]esources.uspGetEmployees2;
go
execute HumanResourcesHuman[[R]]esources.uspGetEmployees2 N'Wi%'
go
execute HumanResources.uspGetEmployees2 N'[DC]%';
go
execute HumanResourcesHuman[[R]]esources.uspGetEmployees2 N'H%', N'S%';
go
====[http://msdn.microsoft.com/ja-jp/library/ms189837(v=SQL.90).aspx SET NOCOUNT]====
*ON の場合、行数は返されません。SET NOCOUNT が OFF の場合、行数が返されます。
*ON の場合でも、@@ROWCOUNT [[R]]OWCOUNT 関数は更新されます。
*実際に返すデータが少量のステートメントで構成されるストアド プロシージャの場合、ネットワーク通信量が大きく減少するので、SET NOCOUNT を ON に設定するとパフォーマンスが大きく向上します。