ダイナミック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'
サンプルコード:
参照
ダイナミック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)