Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Caché TSQL 言語要素

この章では、以下の TSQL 言語要素について説明します。

リテラル

文字列リテラル

文字列リテラルは引用符で区切る必要があります。優先的に使用される区切り文字は一重引用符です。SET DELIMITED_IDENTIFER OFF を指定すれば二重引用符も使用できます。それ以外の場合、二重引用符は識別子の区切り文字として解析されます。

一重引用符で文字列リテラルを区切ると、文字列内にリテラル二重引用符を含めることができます。文字列内にリテラル一重引用符を含めるには、一重引用符を 2 つ入力して引用符を二重にします。

リテラルの一重引用符が含まれる文字列 ('this is an ''embedded'' string' など) を Caché でコンパイルすると、二重引用符の中に一重引用符が含まれた文字列 ("this is an 'embedded' string") に変換されます。

空の文字列

Transact-SQL コードを Caché TSQL に移行する場合は、空文字列の再定義が必要となる場合があります。この再定義を行うには、以下の Caché システム・グローバルを設定します。

^%SYS("sql","sys","namespace",nspace,"empty string")

引用符付き文字列として指定されたネームスペース名 nspace を除き、ここで指定される値はすべてキーワードのリテラルです。

Caution:

空文字列定義の変更には特に注意が必要です。この変更により、空文字列に対して異なる表現を含むデータが作成される可能性があります。また、このネームスペースで既存のプログラムを実行すると失敗する場合もあります。空文字列を定義したら、すべてのクエリ・キャッシュを削除して、変更前の空文字列定義を使用するネームスペースのすべてのクラスとルーチンをリコンパイルする必要があります。

以下の ObjectScript の例では、SAMPLES ネームスペースの空文字列定義を変更します。最初に、空文字列の値を 1 つの空白に設定します。次に、空文字列の値を ASCII コード 0 で表される出力不能文字に設定します (この例では、その直後に空文字列を Caché の既定値にリセットします)。

  SET ^%SYS("sql","sys","namespace","SAMPLES","empty string")=" "
  WRITE !,"Empty string set to:"
  ZZDUMP ^%SYS("sql","sys","namespace","SAMPLES","empty string")
  SET ^%SYS("sql","sys","namespace","SAMPLES","empty string")=$CHAR(0)
  WRITE !,"Empty string set to:"
  ZZDUMP ^%SYS("sql","sys","namespace","SAMPLES","empty string")
  SET ^%SYS("sql","sys","namespace","SAMPLES","empty string")=""
  WRITE !,"Empty string reset to:"
  ZZDUMP ^%SYS("sql","sys","namespace","SAMPLES","empty string")
  WRITE !,!,"End of sample program"

NULL

TSQL では、ブーリアン演算に指定された NULL は、以下の例に示すように、False として返されます。

DECLARE @var BINARY(1)
SELECT @var=NULL
IF @var PRINT "true" ELSE PRINT "false"

Sybase 言語では、NULL は NULL と等しくなります。NULL=NULL 比較は True を返し、NULL != NULL 比較は False を返します。

MSSQL 言語では、任意の値と NULL の比較は False を返します。したがって、NULL=NULL 比較と NULL != NULL 比較の両方が False を返します。

DECLARE @var BINARY(1)
SELECT @var=NULL
IF @var=NULL PRINT "true" ELSE PRINT "false"

Sybase 言語では、NULL はいずれの値とも等しくなりません。したがって、NULL およびブーリアン、数値、または文字列値 (空の文字列 ("") も含まれます) を含む Not Equals (!=) 比較は True を返します。Equals (=)、Greater Than (>)、Less Than (<) 比較はすべて、False を返します。

MSSQL 言語では、NULL を値と比較することはできません。したがって、Equals (=)、Not Equals (!=)、Greater Than (>)、Less Than (<) 比較はすべて、False を返します。

TSQL の文字列連結演算では、NULL は空の文字列に相当します。TSQL の数値演算では、NULL は 0 に相当します。

16 進数

Caché TSQL は、TSQL ソース・コード内の 16 進数の数値リテラルを対応する 10 進数 (10 進法) の数値リテラルに自動的に変換します。

予約語

Caché TSQL では、識別子に SQL Server の予約語を使用できません。SQL 構成設定の [QUOTED_IDENTIFIER] が [はい] に設定されている場合は、Caché TSQL で Caché SQL 予約語 (SQL Server の予約語ではない) を使用できます。

コメント、空白行、セミコロン

Caché TSQL では、1 行のコメントと複数行のコメントの両方をサポートします。

  • その行の最後までが 1 行コメントです。TSQL シェルでコメントを使用すると、/x や /c などの文末修飾子はコメントに含まれません。Caché TSQL では、1 行コメントの区切り文字として –– と // の両方をサポートします。

  • 複数行コメントは、/* で開始し、*/ で終了します。コメントでは、/* ...*/ コメントを入れ子にすることもできます。

PRINT 'these are comments'
-- this is a single-line comment
// this is a single-line comment
/* This is a multi-line comment
The command
PRINT 'do not print'
is part of the comment and is not executed */

TSQL 専用の文

Caché TSQL では、Caché TSQL コードでは実行可能で、Transact-SQL では実行されないコメントとして解析される文を記述できます。2 つのハイフンと垂直バーから始まる文は、Caché では実行可能な文として解析されます。Sybase Adaptive Server と Microsoft SQL Server では、Transact-SQL コメントと見なされます。

PRINT 'any context'
-- PRINT 'commented out'
--| PRINT 'InterSystems only'

セミコロン

2 つのハイフンまたはセミコロンのいずれかを使用することにより、空白行を指定できます。

TSQL 文の前後のセミコロンは無視されます。これは、セミコロンで文が終了する Transact-SQL コード (ストアド・プロシージャなど) との互換性を保つためにサポートされています。

PRINT 'no semicolon'
--
PRINT 'trailing semicolon';
;
;PRINT 'leading semicolon'

識別子

識別子とは、テーブル、列、ビュー、キー、インデックス、トリガ、ストアド・プロシージャなどのTSQL オブジェクトの名前です。識別子の命名規約は、以下のとおりです。

  • 識別子の最初の文字は、英字、アンダースコア (_)、またはパーセント (%) 記号にする必要があります。

  • 識別子の 2 文字目以降は、英字、数字、アンダースコア (_)、ドル記号 ($)、またはシャープ記号 (#) を使用できます。

  • 識別子の長さに制限はなく、最初の 30 文字は一意である必要があります。

  • 識別子では、大文字と小文字は区別されません。

  • 識別子には SQL 予約語を使用できません。

  • 識別子のシャープ記号 (#) の接頭語は、それが一時テーブルの名前であることを示します。

  • 識別子のアットマーク (@) の接頭語は、それが変数名であることを示します。

一部の識別子はスキーマ名で修飾されています。例えば、schema.tablename や schema.storedprocedure のように修飾されています。スキーマ名が省略されている場合は、その識別子は未修飾です。TSQL は、schemaPath プロパティを使用して未修飾の識別子を解決します。このプロパティでは、指定されたテーブル名やストアド・プロシージャ名を検索する場所となるスキーマ検索パスが指定されます。

区切り識別子および引用符で囲まれた識別子

区切り識別子は、通常の識別子の名前付け規約による制限を受けません。例えば、区切り識別子は SQL 予約語と同じ語にできます。区切り識別子にはスペース文字を含めることができます。

既定では、角括弧および二重引用符の両方が、識別子を区切るために使用できます。これらの区切り文字は置き換えできます。区切り識別子は角括弧で囲んで定義します。また、二重引用符で囲んで指定すると、同じ区切り識別子を呼び出すことができます。

SQL 構成設定の [QUOTED_IDENTIFIER] が [はい] に設定されている場合は、引用符で囲まれた識別子を指定できます。引用符で囲まれた識別子を指定するには、その識別子を二重引用符で囲みます。QUOTED_IDENTIFIER がオンの場合、二重引用符が識別子の区切り文字として解析されます。QUOTED_IDENTIFIER がオフの場合、二重引用符が文字列リテラルの代替の区切り文字として解析されます。文字列リテラルの望ましい区切り文字は一重引用符です。引用符で囲まれた識別子には、空白を含め、あらゆる文字を使用できます。

データ型

ローカル変数とテーブルの列では、次のデータ型がサポートされています。これらのデータ型は、有効なデータ型として解析される場合はサポートされます。範囲や値は検証されません。

BINARY(n) および VARBINARY(n)。(n) のサイズ指定は必須です。

BIT

BOOLEAN

CHAR と VARCHAR

CHAR(n)、NCHAR(n)、VARCHAR(n)、および NVARCHAR(n)

VARCHAR(MAX) および NVARCHAR(MAX)。既定では、これらは %Stream.GlobalCharacterOpens in a new tab にマップされます。

DATETIME および SMALLDATETIME

DECIMAL、DECIMAL(p)、および DECIMAL(p,s)。ここで ps は、精度 (合計桁) とスケール (小数桁) を指定する整数です。

DOUBLE および DOUBLE PRECISION

FLOAT および FLOAT(n)

INT、BIGINT、SMALLINT、および TINYINT

MONEY および SMALLMONEY

NATIONAL

NUMERIC、NUMERIC(p)、および NUMERIC(p,s)。ここで ps は、精度 (合計桁) とスケール (小数桁) を指定する整数です。

REAL

TIMESTAMP

Note:

Microsoft SQL Server の TIMESTAMP データ型は、日付や時刻の情報を示す目的では使用されません。これは、テーブルでレコードの挿入または更新が行われた回数を示す整数カウンタです。YYYY-MM-DD HH:MM:SS.nnnnnnnnn 形式で日付や時刻を示す Caché SQL および ODBC の TIMESTAMP データ型と混同しないでください。TSQL では、日付や時刻の値を示すのに DATETIME や SMALLDATETIME を使用します。

ROWVERSION

SQL_VARIANT

次の SQL Server データ型は、特定のコンテキストにおいてサポートされます。

CURSOR

NTEXT、TEXT。既定では、これらは %Stream.GlobalCharacterOpens in a new tab にマップされます。

IMAGE

TABLE

以下は実装されていません。

  • 16 バイトのバイナリ文字列として格納される UNIQUEIDENTIFIER。代わりに VARCHAR(32) をグローバルに一意な ID のデータ型として使用します。

  • SQL92 オプションおよび TSQL オプション

  • UPDATE OF

演算子

算術演算子および等値演算子

Caché TSQL では、+ (加算)、– (減算)、* (乗算)、/ (除算)、および % (モジュロ算術) の各演算子がサポートされます。

Caché TSQL では、以下の等値および比較演算子がサポートされます。

  • = (等しい)

  • <> (等しくない) および != (等しくない)

  • < (より小さい)、!< (より小さくない)、<= (以下)

  • > (より大きい)、!> (より大きくない)、>= (以上)

異なるデータ型の日付値で等値比較 (= または <>) を行う場合、すべての日付値および時間値は TIMESTAMP データ型を使用して比較されます。したがって、異なる形式の 2 つの日付を意味のある方法で比較できます。例えば、STRING データ型として宣言されている日付値を、DATETIME データ型として宣言されている日付値と比較できます。

連結演算子

Caché TSQL では、連結演算子および加算演算子の両方で + (プラス記号) がサポートされます。文字列と共に使用すると、プラス記号は連結演算子として機能します。この演算子を使用すれば複数の文字列を連結できます。すべての項目が文字列であれば連結演算が実行されますが、項目に 1 つでも数値が含まれている場合、TSQL は非数値文字列を 0 として加算演算を実行します。

'world'+'wide'+'web' は 'worldwideweb' に連結されます。

'world'+'33'+'web' は 'world33web' に連結されます。

'world'+33+'web' では加算演算が実行されます (0+33+0=33)。

TSQL の文字列連結演算では、NULL は空の文字列に相当します。TSQL の数値演算では、NULL は 0 に相当します。プラス記号 (+) は連結と加算の両方に使用されるため、NULL 変数のデータ型宣言は重要です。以下の例はすべて、“bigdeal” を返します。

DECLARE @var1 BINARY(1)
DECLARE @var2 VARCHAR(10)
SELECT @var1=NULL,@var2=NULL
PRINT "big"+NULL+"deal"
PRINT "big"+@var1+"deal"
PRINT "big"+@var2+"deal"

以下の例は 0 を返します。この例では、+ を数値演算子として扱い、引数を 0 + 0 + 0 = 0 と解釈します。

DECLARE @var1 INT
SELECT @var1=NULL
PRINT "big"+@var1+"deal"

Caché TSQL では、連結演算子として || もサポートされます。

比較演算子

BETWEEN

Caché TSQL では、BETWEEN num1 AND num2 という形式で、範囲をチェックする BETWEEN 演算子がサポートされます。BETWEEN には指定された範囲の上限値と下限値が含まれます。

IS NULL

Caché TSQL では、IS NULL マッチ演算子がサポートされます。宣言されても値が割り当てられない変数および明示的に NULL と指定されている変数は、NULL として処理されます。空の文字列は NULL ではありません。

LIKE

Caché TSQL では、LIKE パターン・マッチ演算子がサポートされます。LIKE では、文字のマッチングで大文字と小文字が区別されません。Caché TSQL では、NOT LIKE もサポートされます。

NOT 論理演算子

NOT 論理演算子は、後に続く文の真偽値を反転します。例えば、IF NOT EXISTS(...) のように指定します。NOT では大文字と小文字が区別されません。

ビット単位論理演算子

Caché TSQL では、INTEGER データ型に対して AND (&)、OR (|)、XOR (^)、および NOT (~) ビット演算子がサポートされます。10 進数の整数値がバイナリ値に変換されて論理演算が実行され、その結果として得られるバイナリ値が 10 進数の整数値に変換されます。NOT (~) 演算子はビットを反転する単項演算子です。

FeedbackOpens in a new tab