【MSsqlserver】ストアド・プロシージャ学習開始


3年ほど前、自分でストレージプロセスをやったことがあります.oracleのデータベースでやったのです.
今プロジェクトは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 --