ダイナミックSQLを初めて書く経験

2096 ワード

前言
参照
ダイナミックSQLで保存プロセスを書く理由は、プロジェクトに格納プロセスがあります。フィールド名を変数として扱わなければなりません。
フィールド名、テーブル名、データベース名などを変数として使う場合は、ダイナミックSQLを使う必要がありますので、動的SQLの書き込みを習い始めます。
動的SQLの注意事項を書きます。
参照
ダイナミックな列:  
   
  (1)二つの単引用符で一つを表します。  
  (2)日付はシングルクォーテーションマークが必要です。  
  (3)日付型は、まず文字型に変換し、cast()またはconvert()を使用する必要があります。eg:Covert(Varchar(10)@Beginnent,120)  
  (4)数字型は、まず文字型に変換する必要があります。Rtrim(数字型変数)を使用します。ここでは文字列に変換されますが、動的SQL列には引用符だけで引き起こされることはありません。
これは@SQLの前になぜNの説明を加えたのですか?
参照
Transact-SQL文またはバッチ処理を含むUnicode文字列、stmtは、暗黙的にテックスに変換できるUnicode定数または変数でなければなりません。より複雑なUnicode式(たとえば+演算子を使って直列に2つの文字列を並べる)は使用できません。文字の定数は使用できません。定数を指定すると、プレフィックスとしてNを使用しなければなりません。例えば、Unicode定数N'sp_who'は有効ですが、文字の定数'sp_whoは無効です。文字列のサイズは利用可能なデータベースサーバのメモリによってのみ制限されます。
stmtは、変数名と同じ形式のパラメータを含むことができます。例えば、
N'SELECT*FROM Employes WHERE Employee ID=@IDParameeter'
サンプルコード:

DECLARE @SearchType varchar(20)
	IF @SearchTypeID = 1
		SET @SearchType = 'Name'       --      
	ELSE IF @SearchTypeID = 2
		SET @SearchType = 'FromAddress'--       
	ELSE IF @SearchTypeID = 3
		SET @SearchType = 'TOAddress'  --       

DECLARE @SqlWhere varchar(1000)
	SET @SqlWhere= 'WHERE UserName ='''+@UserName+''''
IF @FolderID <>0                                         --           ,      ID  
	SET @SqlWhere = @SqlWhere+' AND FolderID = '+Rtrim(@FolderID)
IF @BeginDateStr <>''									 --     							
	SET @SqlWhere = @SqlWhere+' AND (CreateDate between '''+@BeginDateStr+''' AND '''+ @EndDateStr+''') '
IF @Key <>''											 --      	
	SET @SqlWhere = @SqlWhere+' AND '+@SearchType +' LIKE ''%'+@Key+'%'''

DECLARE @SQL VARCHAR(400)
	
	SET @SQL = N'SELECT * FROM AjaxMail '+@SqlWhere 

----      ----
	EXEC(@SQL)