国際化に対応した Transact-SQL ステートメントの記述
以下のガイドラインに従うと、Transact-SQL ステートメントを使用するデータベースやデータベース アプリケーションをある言語から別の言語に移行することが容易になり、複数の言語をサポートできます。
char、varchar、および text の各データ型を使用しているすべての個所をそれぞれ nchar、nvarchar、および nvarchar(max) データ型に置き換えます。これを行うことにより、コード ページの変換の問題について考慮する必要がなくなります。詳細については、「Unicode データを使用した作業」および「Unicode を使用したサーバー側のプログラミング」を参照してください。
月単位または曜日単位で比較や操作を行う場合、名前の文字列ではない数字の日付要素を使用します。言語設定が異なると、月や曜日の名前が異なります。たとえば、DATENAME(MONTH,GETDATE()) は、言語の設定が英語 (U.S.) になっていれば "May" を返します。設定がドイツ語になっていれば "Mai"、フランス語になっていれば "mai" を返します。代わりに、DATEPART のような関数を使用すると、月の名前の代わりに数字が返されます。多くの場合、日付を数字で表記するよりも名前で表記する方がよりわかりやすくなるので、ユーザーに表示する結果セットを構築するときは、DATEPART 名を使用してください。ただし、特定の言語の表示名に依存するロジックはコーディングしないでください。
日付を比較する場合、または INSERT ステートメントまたは UPDATE ステートメントで日付を指定する場合は、どの言語設定でも同じ解釈が行われる制約を使用します。
ADO、OLE DB、および ODBC アプリケーションでは、以下に示す ODBC タイムスタンプ、日付、時刻のエスケープ句を使用する必要があります。
{ ts'yyyy-mm-ddhh**:mm:ss[.fff] '} 例 : { ts'1998-09-24 10:02:20' }**
{ d'yyyy-mm-dd**'}** 例 : { d'1998-09-24**'}**
{ t'hh:mm:ss'} 例 : { t'10:02:20'}
他の API、または Transact-SQL スクリプト、ストアド プロシージャ、およびトリガーを使用するアプリケーションでは、区切られていない数字列を使用してください。たとえば、yyyymmdd には 19980924 を使用します。
他の API、または Transact-SQL スクリプト、ストアド プロシージャ、およびトリガーを使用するアプリケーションでは、time 型、date 型、smalldate 型、datetime 型、datetime2 型、または datetimeoffset 型のデータ型と文字列データ型間の変換にはすべて、明示的なスタイル パラメーターを指定して CONVERT ステートメントを使用してください。たとえば、次のステートメントは、すべての言語または日付形式の接続設定で同じように解釈されます。
SELECT * FROM AdventureWorks2008R2.Sales.SalesOrderHeader WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)
詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。
日付と時刻書式の移植性の詳細については、「日時データの使用」を参照してください。