再利用。ストアド プロシージャは再利用できるため、データベース開発者の作業負荷が軽減されます。
(2) パフォーマンスを向上させる。ストアド プロシージャは作成時にコンパイルされ、将来使用するときに再コンパイルする必要はありません。一般的な SQL ステートメントは実行するたびにコンパイルする必要があるため、ストアド プロシージャを使用すると効率が向上します。
(3) ネットワークトラフィックを削減します。ストアド プロシージャはサーバー上に配置されているため、呼び出すときはストアド プロシージャの名前とパラメータを渡すだけで済むため、ネットワーク上で送信されるデータの量が削減されます。
(4) 安全性。パラメーター化されたストアド プロシージャは SQL インジェクション攻撃を防ぐことができ、ストアド プロシージャにアクセス許可の付与、拒否、取り消しを適用できます。
ストアド プロシージャは、ユーザー定義ストアド プロシージャ、拡張ストアド プロシージャ、システム ストアド プロシージャの 3 つのカテゴリに分類されます。
このうち、ユーザー定義ストアドプロシージャは、Transaction-SQL と CLR の 2 種類に分けられます。
Transaction-SQL ストアド プロシージャは、ユーザーが指定したパラメーターを受け入れて返すことができる、保存された Transaction-SQL ステートメントのコレクションを指します。
CLR ストアド プロシージャとは、ユーザー指定のパラメータを受け入れて返すことができる .Net Framework 共通言語ランタイム (CLR) メソッドへの参照を指します。これらは、.Net Framework アセンブリ内のクラスのパブリック静的メソッドとして実装されます。
ストアド プロシージャを作成するステートメントは次のとおりです。
引用された内容は次のとおりです:
CREATE { PROC | PROCEDURE } [schema_name.]procedure_name [ ;number ]
[ { @parameter [ type_schema_name ] data_type }
[ VARYING ] ] [ = デフォルト ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH
[ FOR REPLICATION ]
AS {
[; ]
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
{ [ BEGIN ] ステートメント [ END ] }
Go
Create PROC Angyang8848.allgoods
as select * from master_goods
Go
の実行: AllGoods の実行でエラーが発生しました。
実行: yangyang8848.AllGoods の実行は正しく実行されます。
[数値]: 同じ名前のプロシージャをグループ化するために使用されるオプションの整数。これらのグループ化されたプロシージャをまとめて削除するには、DROP PROCEDURE ステートメントを使用します。 Re 例: Create Proc S1; 1
AS
Select * from Master_goods
Create PROC S1; 2
AS
SELECT * from Master_Location
Go
は 2 つのストレージ手順を完了します。これらは同じグループ S1 に属します。Exec S1 が実行されると、ストアド プロシージャはデフォルトで Exec S1 を実行します。1.すべての基本情報を取得したい場合は、Exec S1;2 を実行する必要があります。ストアド プロシージャを削除する場合は、Drop Exec S1 を実行するだけで、グループ内のすべてのストアド プロシージャが削除されます。 M [@ パラメータ]: ストレージ プロシージャ内のパラメータ。パラメータがデフォルト値を定義するか、パラメータを別のパラメータと等しいものとして設定しない限り、ストレージ プロセスを呼び出すときにユーザーがパラメータ値を割り当てる必要があります。
ストアド プロシージャには、最大 2100 個のパラメータを含めることができます。
例:
プロセス yangyang8848.OneGoods を作成します
@GoodsCode varchar(10)
@Code varchar(10) を宣言
@Code = '0004' を設定
@Code yangyang8848.OneGoods を実行パラメーターの後に Output を追加すると、パラメーターが出力であることを示しますパラメータ。 O Create PROC Yangyang8848.Onegoods
@GOODSCODE2 VARCHAR (10) 出力、@GOODSCODE VARCHAR (10) = '0011'
AS
From Master_GOODS WHERE GOODSCODE = @GOODSCODE
SET @GOODSCODE2 = '0005'
Go
callメソッド:
Declare @vv2 varchar (10)
Exec yangyang8848.onegoods @Code Out
注: ストレージ プロシージャの 2 つのパラメーターにデフォルト値がある場合は、デフォルトのデフォルトを設定する必要があります。そうしないと、問題が発生します ~~
。注意深い人なら、上記のステートメントにはいくつかの違いがあることに気づくかもしれません。たとえば、ストアド プロシージャは出力を使用しますが、呼び出し側ステートメントは out を使用します。私がここで言いたいのは、どちらも同じです。
[RECOMPILE]: 実行時にコンパイルされるこのプロシージャのプランをキャッシュしないようにデータベース エンジンに指示します。 FOR REPLICATION が指定されている場合、このオプションは使用できません。 CLR ストアド プロシージャの場合、RECOMPILE は指定できません。
これは非常に便利な関数です。 OBJECT_ID: スキーマのスコープ内のオブジェクトのデータベース オブジェクト識別番号を返します。
例: ストアド プロシージャを作成するときは、次のようにコードを記述できます
If Object_ID('yangyang8848.OneGoods') Is Not Null
Create Proc yangyang8848.OneGood s
@GoodsCode2 varchar (10) 出力、@GoodsCode varchar(10) = '0011'
次の SQL クエリを呼び出します
しかし、ストアド プロシージャに [ENCRYPTION] を追加すると、結果は何も表示されなくなります
If Object_ID('yangyang8848.OneGoods') Is Not Null
gyang8848.OneGoods
@GOODSCODE2 VARCHAR (10) OUT, @ GOODSCODE VARCHAR (10) = '0011'
Encryption
s 付き
Select * from Master_goods where goodScode = @GOODSCODE
SET OODSCODE2 = '0005'
Go
次に、次の SQL を実行します: Exec sp_helptext 'yangyang8848.OneGoods'
次の結果が得られます: オブジェクト 'yangyang8848.OneGoods' のテキストは暗号化されています。
この時点で、パラメータ [ENCRYPTION]: は CREATE PROCEDURE ステートメントの元のテキストをファジー形式に変換する暗号化関数であることを理解する必要があります。難読化されたコードの出力は、SQL Server 2005 のカタログ ビューに直接表示できません。システム テーブルまたはデータベース ファイルにアクセスできないユーザーは、難読化されたテキストを取得できません。ただし、このテキストは、DAC ポートを介してシステム テーブルにアクセスするか、データベース ファイルに直接アクセスできる特権ユーザーによって使用できます。さらに、デバッガをサーバー プロセスに接続できるユーザーは、実行時にメモリから復号化されたプロセスを取得できます。
2 日前にカーソルに関する紹介記事を書きました。ストアド プロシージャでカーソルを使用する例を次に示します。
If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go O Create Proc GetmasterGoods
With Encryption
as SET @Mycursor = Cursor
Select GoodsCode, Goodsname From_go ODS
Open @MyCursor
Go
- 以下の別のストレージ プロシージャ カーソル出力結果をトラバースします
Create Proc GetAllGoodsIDAndName
@GoodsName nvarchar(20) を宣言します
Ex Cursor ec GetMasterGoods @MasterGoodsCursor out
InTo @GoodsCode, @GoodsName
@MasterGoodsCursor から次を取得
InTo @GoodsCode,@ GoodsName
End
Close @MasterGoodsCursor
Deallocate @ MasterGoodsCursor
Go
Exec GetAllGoodsIDAndName を実行した最終結果は次のとおりです
0003: Product 0003
0004: Product 0004
0005:123123
0006: 製品 0006
0007: 製品 0007
0008: 製品 0008
0009: 製品 0009
0011: 品目 0011
0012: 品目 0012 0013: 品目 0013
0014: 品目 0014