【MSsqlserver】ストアド・プロシージャ学習開始
3518 ワード
3年ほど前、自分でストレージプロセスをやったことがあります.oracleのデータベースでやったのです.
今プロジェクトはms sql serverにあります.ストレージ・プロシージャもあります.
だからこの方面に対して1つの全方面の理解と学習を行う必要があります.
1、最も基本的なストレージプロセス.
コード解析から始めましょう.
このprocedureは何の意味もありません.プレゼンテーションとしてだけです.
まず、最初の文はデータベースを使用することです.1つのデータベースエンジンに複数のデータベースがある場合は、この必要があります.
go文の後には、uspGetAllEmployeesが存在するかどうかをクエリーします.
OBJECTの使用ID('HumanResources.uspGetAllEmployees','P')がクエリーされます.次の2番目のパラメータは「P」で、procedureをクエリーすることを意味します.
Oracleとは異なります.oracleはCREATE OR REPLACEを採用しています.
2つ目はprocedureの始まりです.
彼の中には実は簡単なクエリー文があります.
このprocedureは入力も出力もありません.
だから大きな意味はありません.この値は入門として使用されます.
ms server動的sql実行
参照は@tablenameです.参照名のtableを作成する必要があります.
定義#テイギ#
次に
終始実行できない
なぜなら、このように定義できないからです.
別々に定義する必要があります
次のようになります.
これで成功します.
Sysobjectsのtypeフィールドタイプの説明:
データベース・ストレージ・プロシージャは配列タイプをサポートしません.
相手が配列内のすべてのデータを更新する必要があるとしたらどうする?
ではstringを配列に適用しますが、ここでは「,」などの分割記号を定義する必要があります.
以下に、同様のストレージ・プロシージャを示します.
ストレージ・プロシージャは、ネットワーク上で探します.使用可能
実行方法:
-----------------------------------------------------------------
ストレージ・プロシージャのエラーの問題.
検出せずにsqlを直接実行すると異常が発生します.
この異常情報を入手できれば
もちろん異常を捕まえることをお勧めします.
今プロジェクトはms sql serverにあります.ストレージ・プロシージャもあります.
だからこの方面に対して1つの全方面の理解と学習を行う必要があります.
1、最も基本的なストレージプロセス.
コード解析から始めましょう.
USE AdventureWorks2008R2;
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, Department
FROM HumanResources.vEmployeeDepartmentHistory;
GO
このprocedureは何の意味もありません.プレゼンテーションとしてだけです.
まず、最初の文はデータベースを使用することです.1つのデータベースエンジンに複数のデータベースがある場合は、この必要があります.
go文の後には、uspGetAllEmployeesが存在するかどうかをクエリーします.
OBJECTの使用ID('HumanResources.uspGetAllEmployees','P')がクエリーされます.次の2番目のパラメータは「P」で、procedureをクエリーすることを意味します.
Oracleとは異なります.oracleはCREATE OR REPLACEを採用しています.
2つ目はprocedureの始まりです.
彼の中には実は簡単なクエリー文があります.
このprocedureは入力も出力もありません.
だから大きな意味はありません.この値は入門として使用されます.
ms server動的sql実行
参照は@tablenameです.参照名のtableを作成する必要があります.
定義#テイギ#
declare @sql varchar(200)='create table '+@tablename+'(id int)'
次に
exec @sql
終始実行できない
なぜなら、このように定義できないからです.
別々に定義する必要があります
次のようになります.
declare @sql varchar(200)
set @sql='create table'+@tablename+(id int)
exec @sql
これで成功します.
Sysobjectsのtypeフィールドタイプの説明:
C = CHECK
D = DEFAULT
F = FOREIGN KEY
L =
FN =
IF =
P =
PK = PRIMARY KEY ( K)
RF =
S =
TF =
TR =
U =
UQ = UNIQUE ( K)
V =
X =
データベース・ストレージ・プロシージャは配列タイプをサポートしません.
相手が配列内のすべてのデータを更新する必要があるとしたらどうする?
ではstringを配列に適用しますが、ここでは「,」などの分割記号を定義する必要があります.
以下に、同様のストレージ・プロシージャを示します.
alter PROCEDURE testArray
@ID nvarchar(500)
as
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId int
Set @PointerPrev=1
while (@PointerPrev < LEN(@ID))
Begin
Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)
select @TId
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
-- , , ,
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
select @TId
GO
ストレージ・プロシージャは、ネットワーク上で探します.使用可能
実行方法:
exec testArray @ID='1,2,3,4,5,6,7,8,9'
-----------------------------------------------------------------
ストレージ・プロシージャのエラーの問題.
検出せずにsqlを直接実行すると異常が発生します.
この異常情報を入手できれば
もちろん異常を捕まえることをお勧めします.
delcare @msg varchar(200)
delcare @MyError int=@@Error
select top 1 @msg = description from sys.sysmessages
where error = @MyError and msglangid = 2052 --