Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

TSQL コマンド

この章では、InterSystems IRIS® データ・プラットフォームでサポートされている TSQL コマンドを以下のグループに分けて説明します。

InterSystems IRIS における TSQL の実装では、セミコロンのコマンド・ターミネータを受け付けますが、必須ではありません。TSQL コードを InterSystems SQL にインポートすると、セミコロンのコマンド・ターミネータは削除されます。

データ定義言語 (DDL) 文

以下の DDL 文がサポートされます。

CREATE TABLE

テーブル、そのフィールド、データ型、および制約を定義します。

CREATE TABLE [schema. | #]tablename (fieldname datatype constraint [,...])

"テーブル参照" の説明に従って tablename を指定します。

CREATE TABLE では、テーブル名の先頭に # 文字を付けることにより、一時テーブルを作成できます。一時テーブルは、ストアド・プロシージャからのみ定義できます。ストアド・プロシージャの外部にあるダイナミック SQL から一時テーブルを定義することはできません。完全修飾の一時テーブル名を作成するには、"SQLUser"."#mytemp" のように名前の各要素を引用符で囲みます。

有効なテーブル名は、英字、アンダースコア (_)、または # 記号 (ローカルの一時テーブル用) で始まる必要があります。2 文字目以降は、英字、数字、または #、$、_ 記号を使用できます。テーブル名では、大文字と小文字は区別されません。

フィールド名は、有効な TSQL 識別子である必要があります。フィールド名は角括弧を使用して区切ることができます。これは特に、予約語と同じ名前を持つフィールドを定義する際に便利です。以下の例では、Check および Result という名前の 2 つフィールドを定義しています。

CREATE TABLE mytest ([Check] VARCHAR(50),[Result] VARCHAR(5))

オプションの CONSTRAINT キーワードを使用して、フィールド制約またはテーブル制約に使用するユーザ定義の制約名を指定できます。1 つのフィールドに複数の CONSTRAINT name type 文を指定できます。

InterSystems SQL では制約名を保持しません。そのため、これらの名前は後の ALTER TABLE 文で使用することはできません。

テーブル・フィールド制約 DEFAULT、IDENTITY、NULL、NOT NULL、PRIMARY KEY、[FOREIGN KEY] REFERENCES (キーワード FOREIGN KEY はオプション)、UNIQUE、CLUSTERED、および NONCLUSTERED がサポートされます。テーブル制約 FOREIGN KEY REFERENCES がサポートされます。

フィールド定義の DEFAULT 値には、CURRENT_TIMESTAMP、CURRENT_USER、GETDATE、HOST_NAME、ISNULL、NULLIF、および USER の各 TSQL 関数を指定できます。

フィールド定義の IDENTITY 制約がサポートされ、システムで生成される連続番号が割り当てられます。IDENTITY 引数 seedincrement は解析されますが、無視されます。

TSQL の CREATE TABLE コマンドでは、シャード・テーブルを作成できます。SHARD 節の構文は、InterSystems SQL の CREATE TABLE 文の場合と同じです。

SHARD [ KEY fieldname { , fieldname2 } ] [ COSHARD [ WITH ] [(] tablename [)] ] 

CHECK フィールド制約はサポートされません。CHECK 制約が TSQL ソースのコンパイル中に見つかった場合、InterSystems IRIS はエラー・メッセージを生成して CHECK 制約をサポートしていないことを示します。エラーはコンパイル・ログに記録され (アクティブの場合)、ソースは未サポート・ログに置かれます (アクティブの場合)。

既にテーブルが存在している場合は、SQLCODE -201 エラーが発行されます。

以下のダイナミック SQL の例では、4 つのフィールドがある #mytest という名前の一時テーブルを作成し、そのテーブルにデータを移入してから、結果を表示します。LastName フィールドには、複数の制約があります。FirstName フィールドは既定値を取ります。DateStamp フィールドは、システム定義の既定値を取ります。

  SET sql=9
  SET sql(1)="CREATE TABLE #mytest (MyId INT PRIMARY KEY,"
  SET sql(2)="LastName VARCHAR(20) CONSTRAINT unq_lname UNIQUE "
  SET sql(3)="  CONSTRAINT nonull_lname NOT NULL,"
  SET sql(4)="FirstName VARCHAR(20) DEFAULT '***TBD***',"
  SET sql(5)="DateStamp DATETIME DEFAULT CURRENT_TIMESTAMP)"
  SET sql(6)="INSERT INTO #mytest(MyId,LastName,FirstName) VALUES (1224,'Smith','John')"
  SET sql(7)="INSERT INTO #mytest(MyId,LastName) VALUES (1225,'Jones')"
  SET sql(8)="SELECT MyId,FirstName,LastName,DateStamp FROM #mytest"
  SET sql(9)="DROP TABLE #mytest"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  WRITE status,!
  SET result=statement.%Execute()
  DO result.%Display()

解析されるが無視される

テーブル制約節 WITH、ON、および TEXTIMAGE ON は互換性を保つために解析されますが無視されます。UNIQUE 制約または PRIMARY KEY 制約の index_options 節は互換性を保つために解析されますが、無視されます。

テーブル制約の以下の SQL サーバの括弧で囲んだ WITH オプションは解析されますが、無視されます。ALLOW_PAGE_LOCKS、ALLOW_ROW_LOCKS、DATA_COMPRESSION、FILLFACTOR、IGNORE_DUP_KEY、PAD_INDEX および STATISTICS_NORECOMPUTE。

フィールド制約 CLUSTERED および NONCLUSTERED は互換性を保つために解析されますが、無視されます。

ALTER TABLE

テーブル、そのフィールド、データ型、および制約を変更します。

以下の構文形式がサポートされます。

ALTER TABLE tablename ADD fieldname datatype [DEFAULT value] 
     [{UNIQUE | NOT NULL} | CONSTRAINT constraintname {UNIQUE | NOT NULL} ]
ALTER TABLE tablename ALTER COLUMN fieldname newdatatype
ALTER TABLE tablename DROP COLUMN fieldname [,fieldname2]
ALTER TABLE tablename ADD tableconstraint FOR fieldname
ALTER TABLE tablename DROP tableconstraint
ALTER TABLE tablename DROP FOREIGN KEY role
ALTER TABLE tablename ADD CONSTRAINT constraint DEFAULT defaultvalue FOR fieldname
ALTER TABLE tablename ADD CONSTRAINT constraint FOREIGN KEY
ALTER TABLE tablename DROP CONSTRAINT constraint

"テーブル参照" の説明に従って tablename を指定します。

  • ALTER TABLE...ADD fieldname では、1 つのフィールド定義またはフィールド定義のコンマ区切りリストを追加できます。

    • DEFAULT がサポートされます。

    • テーブルにデータが含まれていない場合、NOT NULL がサポートされます。テーブルにデータが含まれている場合、NOT NULL を指定できるのは、フィールドで DEFAULT 値も指定している場合のみです。

    • UNIQUE は解析されますが、無視されます。一意制約を設定するには、UNIQUE キーワードを指定して CREATE INDEX コマンドを使用します。

    ALTER TABLE...ADD fieldname でサポートされる完全な構文は、次のとおりです。

    ALTER TABLE tablename
       [ WITH CHECK | WITH NOCHECK ]
      ADD fieldname datatype [DEFAULT value] 
         [{UNIQUE | NOT NULL} | CONSTRAINT constraintname {UNIQUE | NOT NULL} ]
         [ FOREIGN KEY (field1[,field2[,...]])
         REFERENCES tablename(field1[,field2[,...]]) ]
    

    WITH CHECK | WITH NOCHECK は InterSystems IRIS により解析はされますが、無視されます。Transact-SQL では、WITH CHECK | WITH NOCHECK により新規の制約もしくは新たに有効となった制約に対して、既存データの実行時間チェックが用意されています。InterSystems TSQL では特にそのサポートはありませんが、InterSystems SQL では新規の制約に対する既存データのチェックが行われます。

    Sybase の PARTITION BY 節はサポートされません。

  • ALTER TABLE...ALTER COLUMN fieldname datatype では、既存のフィールドのデータ型を変更できます。指定された datatype がフィールドの既存のデータ型と同じである場合も、このコマンドはエラーなしで完了します。

  • ALTER TABLE...DROP [COLUMN] fieldname では、1 つの定義済みフィールドまたは定義済みフィールドのコンマ区切りリストを削除できます。キーワード DELETE はキーワード DROP の同義語です。

    • Sybase : COLUMN キーワードは許可されません。CONSTRAINT キーワードは必須です : ALTER TABLE...DROP fieldname, CONSTRAINT constraint

    • MSSQL : COLUMN キーワードは必須です。CONSTRAINT キーワードはオプションです : ALTER TABLE...DROP COLUMN fieldname, constraint

  • ALTER TABLE...DROP [CONSTRAINT] constraintname では、フィールドから制約を削除できます。キーワード DELETE はキーワード DROP の同義語です。

    • Sybase : CONSTRAINT キーワードは必須です。

    • MSSQL : CONSTRAINT キーワードはオプションです。

  • ALTER TABLE...ADD CONSTRAINT...DEFAULT 構文では、フィールド制約は作成されません。代わりに、この構文は ALTER TABLE...ALTER COLUMN...DEFAULT 文と同等に実行されます。これは、InterSystems IRIS では、指定したフィールドの既定値がフィールド・プロパティの初期値式として設定されることを意味します。フィールド制約は定義されないので、この “制約” を後で削除したり、変更したりすることはできません。

    CHECK | NOCHECK CONSTRAINT は、InterSystems IRIS TSQL ではサポートされていません。この CHECK または NOCHECK キーワードの指定により、エラー・メッセージが生成されます。

DROP TABLE

テーブル定義を削除します。

DROP TABLE [IF EXISTS] tablename

テーブル定義を削除します。通常のテーブルと一時テーブルの両方を削除できます (一時テーブル名は '#' 文字で開始します)。存在しない一時テーブル名を指定しても DROP TABLE では無視され、エラーも生成せずに終了します。

"テーブル参照" の説明に従って tablename を指定します。

tablename に関連付けられているビューがある場合、テーブルを削除する前に、ビューを削除する必要があります。

IF EXISTS 節は解析されますが、無視されます。

CREATE INDEX

指定したテーブルまたはビューにインデックスを作成します。

CREATE [UNIQUE] INDEX indexname ON tablename (fieldname [,fieldname2])

1 つのフィールドまたはフィールドのコンマ区切りリストに対してインデックスを作成できます。

インデックスを IDKEY (クラスタ化インデックスとして扱われる)、IDENTITY フィールド (%%ID フィールドにインデックスを作成する)、主キー、またはその他のフィールドに作成できます。

"テーブル参照" の説明に従って tablename を指定します。

UNIQUE キーワードは、指定されたフィールドに対して一意の値制約インデックスを作成します。

次の Transact-SQL 機能は解析されますが無視されます。

  • CLUSTERED/NONCLUSTERED キーワード暗黙的にクラスタ化インデックスとして扱われる IDKEY 以外に、InterSystems TSQL ではクラスタ化インデックスはサポートされません。

  • ON dbspace 節。

  • ASC/DESC キーワード

  • INCLUDE 節

  • WITH FILLFACTOR=n や WITH DROP_EXISTING=ON などの WITH 節オプション。コンマで区切られた WITH 節のオプションのリストは、必要に応じて括弧で囲むことができます。

  • ON ファイルグループまたは IN DB スペース名の節

現在、以下の Transact-SQL 機能はサポートされていません。

  • Sybase のインデックス・タイプ。

  • IN dbspace 節。

  • NOTIFY integer 節。

  • LIMIT integer 節。

  • フィールド名の代わりとしての関数名の使用。

ALTER INDEX 文はサポートされません。

DROP INDEX

インデックス定義を削除します。以下の構文形式のいずれかを使用して、単一のインデックス、またはコンマ区切りのインデックスのリストを削除できます。

DROP INDEX tablename.indexname [,tablename.indexname]

DROP INDEX indexname ON tablename [WITH (...)] [,indexname ON tablename [WITH (...)] ]

tablename は、インデックスが付いたフィールドを含むテーブルの名前です。"テーブル参照" の説明に従って tablename を指定します。#temptable を指定できるのは、現在のネームスペースがシャード・クラスタの一部である場合のみです。

indexname はインデックスの名前です。標準的な識別子または引用符で囲まれた識別子を指定できます。

括弧内に値が記述された WITH (...) 節は、互換性の構文チェックは通過しますが、検証されず、操作は何も実行されません。

IF EXISTS 節はサポートされません。

CREATE TRIGGER

文レベルのトリガを作成します。

CREATE TRIGGER triggername ON tablename
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF} {INSERT | DELETE | UPDATE}
[WITH APPEND]
[NOT FOR REPLICATION] 
AS tsql_trigger_code

トリガは、1 つのイベント (INSERT) について作成することも、イベントのコンマ区切りリスト (INSERT,UPDATE) について作成することもできます。

"テーブル参照" の説明に従って tablename を指定します。

FOR、AFTER、および INSTEAD OF キーワードは同義語です。イベント操作が実行されると、常にトリガがプルされます。

同じイベントまたはイベントのコンマ区切りリストに対して複数のトリガがある場合は、トリガが作成された順に実行されます。

WITH ENCRYPTION、WITH APPEND、NOT FOR REPLICATION の各節は解析されますが、無視されます。

InterSystems TSQL では、行レベル・トリガはサポートされていません。

CREATE PROCEDURE コードに CREATE TRIGGER 文を含めることはできません。

DROP TRIGGER

トリガ定義を削除します。

DROP TRIGGER [owner.]triggername

CREATE VIEW

ビュー定義を作成します。

CREATE VIEW [owner.]viewname 
    [WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA}]
    AS select_statement
   [WITH CHECK OPTION]

viewname は、一意の TSQL 識別子である必要があります。"テーブル参照" の説明に従って viewname を指定します。既にビューが存在している場合は、SQLCODE -201 エラーが発行されます。viewname は、区切り識別子にできます。例えば、CREATE VIEW Sample.[Name/Age View] のようにできます。

既定では、ビューのフィールドの名前は SELECT テーブルのフィールドと同じです。ビューのフィールドに異なる名前を指定するには、SELECT 文でフィールドのエイリアスを指定します。これらのエイリアスがビューのフィールド名として使用されます。

CREATE VIEW NameAgeV
AS SELECT Name AS FullName,Age AS Years FROM Sample.Person

単一のキーワードまたはキーワードのコンマ区切りのリストを含む WITH 節を指定できます。例えば、WITH SCHEMABINDING, ENCRYPTION, VIEW_METADATA のように指定できます。ENCRYPTION、SCHEMABINDING、VIEW_METADATA の各キーワードは解析されますが、無視されます。

select_statement 節は、TOP 節と組み合わせた場合にのみ、ORDER BY 節を含めることができます。ビュー内のすべての行を含める場合は、ORDER BY 節と TOP ALL 節を組み合わせることができます。TOP 節は ORDER BY 節を指定しなくても含めることができます。ただし、TOP 節を使用せずに ORDER BY 節を含めると、SQLCODE -143 エラーが生成されます。

select_statement には、UNION または UNION ALL を含めることができます。

オプションの WITH CHECK OPTION 節を使用すると、レコードからビューへのアクセスをできなくするビューを通じて更新することができなくなります。これには、SELECT 文の WITH 節をチェックします。WITH CHECK OPTION は、CASCADE の既定値を使用して InterSystems SQL にバインドします。

ALTER VIEW 文はサポートされません。

DROP VIEW

ビュー定義を削除します。

DROP VIEW viewname [,viewname2 [,...] ]

単一のビュー、またはコンマ区切りのビューのリストを削除できます。"テーブル参照" の説明に従って viewname を指定します。

DROP VIEW は、全か無かの操作ではありません。存在しないビューをビューのリスト内で検出するまで、リスト内の既存のビューを削除します。存在しないビューを検出した時点で、削除操作は停止し、SQLCODE -30 エラーを返します。

IF EXISTS 節はサポートされません。

CREATE DATABASE

CREATE DATABASE 構文は、互換性を提供するために解析されます。機能は何もありません。

CREATE DATABASE dbname

この基本的な CREATE DATABASE 構文のみが解析されます。

Sybase における追加の CREATE DATABASE 節はサポートされません。

MSSQL におけるデータベースのアタッチとデータベース・スナップショットの作成の構文オプションはサポートされません。

ALTER DATABASE 文はサポートされません。

DROP DATABASE

DROP DATABASE 構文は、互換性を提供するために解析されます。機能は何もありません。

DROP DATABASE dbname

データ管理言語 (DML) 文

  • TSQL は、ダイナミック SQL 内の単一の DML 文の場合、スキーマ検索パスを使用して未修飾テーブル名を解決できます。

  • TSQL は、ダイナミック SQL 内の複数の DML 文の場合には、スキーマ検索パスを使用して未修飾テーブル名を解決することはできません。これには、明示的な BEGIN TRANSACTION の後に単一の DML 文が続く場合などの複数文が含まれます。

DELETE

テーブルからデータ行を削除します。DELETEDELETE ... FROM の両方がサポートされます。

DELETE FROM tablename  WHERE condition

DELETE FROM tablename FROM matchtablename WHERE tablename.fieldname = matchtablename.fieldname

非常に単純なシータ結合のみがサポートされます (FROM table 節は入れ子のサブクエリに変換されます)。

1 つ以上の実行オプションをコンマ区切りリストとして指定することによって、DELETE の実行方法を指定できます。これらのオプションは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_DELETE_HINT: option,option2 */ 

option には、%NOCHECK、%NOFPLAN、%NOINDEX、%NOLOCK、%NOTRIGGER、%PROFILE、%PROFILE_ALL を指定できます。詳細は、InterSystems SQL の "DELETE" コマンドを参照してください。

最適化ヒントをコンマ区切りリストとして DELETE FROM 節に指定できます。これらのヒントは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_DELETEFROM_HINT: hint,hint2 */ 

hint には、%ALLINDEX、%FIRSTTABLE tablename、%FULL、%INORDER、%IGNOREINDICES、%NOFLATTEN、%NOMERGE、%NOSVSO、%NOTOPOPT、%NOUNIONOROPT、および %STARTTABLE を指定できます。詳細は、InterSystems SQL の "FROM" 節を参照してください。

FASTFIRSTROW、HOLDINDEX、INDEX(name)、NOLOCK、PAGLOCK、READCOMMITTED、READPAST、READUNCOMMITTED、REPEATABLEREAD、ROWLOCK、SERIALIZABLE、SHARED、TABLOCK、TABLOCKX、UPDLOCK、XLOCK という table_hints は解析されますが、無視されます。テーブル・ヒントの前に WITH キーワードを付けることもできます。WITH を指定した場合、括弧で囲むかどうかはオプションです。テーブル・ヒントのリストはコンマか空白のスペースで区切られます。

DELETE では、@@ROWCOUNT システム変数に削除する行数を設定し、@@IDENTITY システム変数に最後に削除した行の IDENTITY 値を設定します。

@@ROWCOUNT が 100,000 を超える DELETE では、自動的に UPDATE STATISTICS が呼び出されて、今後のクエリのためにテーブルが最適化されます。

DELETE または TRUNCATE TABLE のいずれかを使用して、テーブルからすべての行を削除することができます。DELETE は @@ROWCOUNT を削除される行の数に設定します。TRUNCATE TABLE の方が効率的ですが、削除される行の数は保持されず、@@ROWCOUNT は -1 に設定されます。DELETE では、RowID カウンタや他の行カウンタはリセットされません。TRUNCATE TABLE では、これらのカウンタはリセットされます。

以下のオプションはサポートされません。

  • MSSQL の行セット関数。

  • MSSQL の OPTION 節。

INSERT

テーブルにデータ行を挿入します。以下の構文形式がサポートされます。

INSERT [INTO] tablename (fieldname[,fieldname2[,...]]) VALUES (list_of_values)

INSERT [INTO] tablename (fieldname[,fieldname2[,...]]) SELECT select_list

INTO キーワードはオプションです。"テーブル参照" の説明に従って tablename を指定します。

VALUES 構文については、VALUES キーワードは MSSQL と Sybase の両方で必須です。list_of_values に、テーブルで定義されている順にユーザ指定のすべてのフィールドがリストされている場合、(fieldname) リストはオプションです。フィールド名が指定されている場合、list_of_values は、数およびデータ型がフィールド名のリストと一致する値のコンマ区切りのリストです。

1 つ以上の実行オプションをコンマ区切りリストとして指定することによって、INSERT の実行方法を指定できます。これらのオプションは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_INSERT_HINT: option,option2 */ 

option には、%NOCHECK、%NOFPLAN、%NOINDEX、%NOLOCK、%NOTRIGGER、%PROFILE、%PROFILE_ALL を指定できます。詳細は、InterSystems SQL の "INSERT" コマンドを参照してください。

FASTFIRSTROW、HOLDINDEX、INDEX(name)、NOLOCK、PAGLOCK、READCOMMITTED、READPAST、READUNCOMMITTED、REPEATABLEREAD、ROWLOCK、SERIALIZABLE、SHARED、TABLOCK、TABLOCKX、UPDLOCK、XLOCK という table_hints は解析されますが、無視されます。テーブル・ヒントの前に WITH キーワードを付けることもできます。WITH を指定した場合、括弧で囲むかどうかはオプションです。テーブル・ヒントのリストはコンマか空白のスペースで区切られます。

INSERT では、@@ROWCOUNT システム変数に挿入する行数を設定し、@@IDENTITY システム変数に最後に挿入した行の IDENTITY 値を設定します。

@@ROWCOUNT が 100,000 を超える INSERT では、自動的に UPDATE STATISTICS が呼び出されて、今後のクエリのためにテーブルが最適化されます。

以下のオプションはサポートされません。

  • (fieldname) DEFAULT VALUES または (fieldname) VALUES (DEFAULT)。フィールドの既定値は、フィールドが INSERT 文で指定されていない場合に使用されます。

  • (fieldname) EXECUTE procname

  • Sybase の insert load option 節 : LIMIT、NOTIFY、SKIP、または START ROW ID。

  • Sybase の insert select load option 節 : WORD SKIP、IGNORE CONSTRAINT、MESSAGE LOG、または LOG DELIMITED BY。

  • Sybase の LOCATION 節。

  • MSSQL の INSERT TOP 節。

  • MSSQL の行セット関数。

UPDATE

テーブルの既存のデータ行の値を更新します。

UPDATE tablename SET fieldname=value [,fieldname2=value2[,...]]
   [FROM tablename [,tablename2]] WHERE fieldname=value

UPDATE tablename SET fieldname=value[,fieldname2=value2[,...]]
   WHERE [tablename.]fieldname=value

次の構文形式はベンダ固有です。

  • Sybase : オプションの FROM キーワード構文を使用して、条件で使用するオプションのテーブル (または結合されるテーブル) を指定します。非常に単純なシータ結合のみがサポートされます (FROM table 節は入れ子のサブクエリに変換されます)。

  • MSSQL : tablename.fieldname 構文を使用して、条件で使用するオプションのテーブルを指定します。

value のデータ型および長さが、fieldname で定義されたデータ型および長さと一致している必要があります。value には、リテラル値に解決される式を指定することも、NULL キーワードを指定することもできます。DEFAULT キーワードを指定することはできません。

"テーブル参照" の説明に従って tablename を指定します。

UPDATE では、SET 節の左側でローカル変数を使用することをサポートしています。このローカル変数は、フィールド名の代わりに使用することも、フィールド名に加えて使用することもできます。以下の例は、フィールド名に対する SET、ローカル変数に対する SET、フィールド名とローカル変数の両方に対する SET を示しています。

UPDATE table SET x=3,@v=b,@c=Count=Count+1

1 つ以上の実行オプションをコンマ区切りリストとして指定することによって、UPDATE の実行方法を指定できます。これらのオプションは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_UPDATE_HINT: option,option2 */ 

option には、%NOCHECK、%NOFPLAN、%NOINDEX、%NOLOCK、%NOTRIGGER、%PROFILE、%PROFILE_ALL を指定できます。詳細は、InterSystems SQL の "UPDATE" コマンドを参照してください。

最適化ヒントをコンマ区切りリストとして UPDATE FROM 節に指定できます。これらのヒントは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_UPDATEFROM_HINT: hint,hint2 */ 

hint には、%ALLINDEX、%FIRSTTABLE tablename、%FULL、%INORDER、%IGNOREINDICES、%NOFLATTEN、%NOMERGE、%NOSVSO、%NOTOPOPT、%NOUNIONOROPT、および %STARTTABLE を指定できます。詳細は、InterSystems SQL の "FROM" 節を参照してください。

FASTFIRSTROW、HOLDINDEX、INDEX(name)、NOLOCK、PAGLOCK、READCOMMITTED、READPAST、READUNCOMMITTED、REPEATABLEREAD、ROWLOCK、SERIALIZABLE、SHARED、TABLOCK、TABLOCKX、UPDLOCK、XLOCK という table_hints は解析されますが、無視されます。テーブル・ヒントの前に WITH キーワードを付けることもできます。WITH を指定した場合、括弧で囲むかどうかはオプションです。テーブル・ヒントのリストはコンマか空白のスペースで区切られます。

UPDATE では、@@ROWCOUNT システム変数に更新する行数を設定し、@@IDENTITY システム変数に最後に更新した行の IDENTITY 値を設定します。

@@ROWCOUNT が 100,000 を超える UPDATE では、自動的に UPDATE STATISTICS が呼び出されて、今後のクエリのためにテーブルが最適化されます。

以下のダイナミック SQL の例は、単純な UPDATE 操作を示しています。

  SET sql=9
  SET sql(1)="CREATE TABLE #mytest (MyId INT PRIMARY KEY,"
  SET sql(2)="LastName VARCHAR(20) CONSTRAINT nonull_lname NOT NULL,"
  SET sql(3)="FirstName VARCHAR(20) DEFAULT '***TBD***')"
  SET sql(4)="INSERT INTO #mytest(MyId,LastName,FirstName) VALUES (1224,'Smith','John')"
  SET sql(5)="INSERT INTO #mytest(MyId,LastName) VALUES (1225,'Jones')"
  SET sql(6)="INSERT INTO #mytest(MyId,LastName) VALUES (1226,'Brown')"
  SET sql(7)="UPDATE #mytest SET FirstName='Fred' WHERE #mytest.LastName='Jones'"
  SET sql(8)="SELECT FirstName,LastName FROM #mytest ORDER BY LastName"
  SET sql(9)="DROP TABLE #mytest"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  WRITE status,!
  SET result=statement.%Execute()
  DO result.%Display()

以下のオプションはサポートされません。

  • Sybase の ORDER BY 節。

  • MSSQL の OPTION 節。

  • MSSQL の TOP 節。

  • MSSQL の行セット関数。

READTEXT

ストリーム・フィールドからデータを読み取ります。

READTEXT tablename.fieldname textptr offset size

MSSQL READTEXT 文は、テーブルのフィールドからのストリーム・データを返します。これには、以下に示すように、TEXTPTR 関数を使用して取得できる、有効なテキスト・ポインタ値が必要です。

DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(Notes) FROM Sample.Person
READTEXT Sample.Person.Notes @ptrval 0 0

textptr はバイナリとして宣言する必要があります。textptr は、NULL ではないテキスト・フィールドに対してのみ定義します。INSERT 文を使用して、テキスト・フィールドに初期の非 NULL 値を指定できます。

offset には、0、正の整数値、または NULL を指定できます。0 ではテキストの先頭から読み取ります。正の整数では offset の位置から読み取ります。NULL ではテキストの末尾から読み取ります。つまり、操作は正常に完了しますが値が返されません。

size には、0、正の整数値、または NULL を指定できます。0 では offset の位置からテキストの末尾までを読み取ります。正の整数では offset の位置から size の文字数を読み取ります。NULL では操作は正常に完了しますが、値が返されません。

MSSQL HOLDLOCK キーワードは解析されますが、無視されます。

WRITETEXT

データをストリーム・フィールドに書き込み、既存のデータ値を置き換えます。

WRITETEXT tablename.fieldname textptr value

MSSQL WRITETEXT は、データをテーブルのストリーム・フィールドに書き込みます。これには、以下に示すように、TEXTPTR 関数を使用して取得できる、有効なテキスト・ポインタ値が必要です。

DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(Notes) FROM Sample.Person
WRITETEXT Sample.Person.Notes @ptrval 'This is the new text value'

textptr はバイナリとして宣言する必要があります。textptr は、NULL ではないテキスト・フィールドに対してのみ定義します。INSERT 文を使用して、テキスト・フィールドに初期の非 NULL 値を指定できます。

MSSQL BULK キーワードはサポートされません。

MSSQL WITH LOG キーワードは解析されますが、無視されます。

UPDATETEXT

ストリーム・フィールドのデータを更新します。

UPDATETEXT tablename.fieldname textptr offset deletelength value

MSSQL UPDATETEXT 文は、テーブルのフィールドからのストリーム・データを更新します。これには、TEXTPTR 関数を使用して取得できる、有効なテキスト・ポインタ値が必要です。以下の例では、既存のデータ値の先頭に「New」という単語を挿入して、Notes ストリーム・フィールドの内容を更新します。

DECLARE @ptrval binary(16);
SELECT @ptrval = TEXTPTR(Notes) FROM Sample.Person
WRITETEXT Sample.Person.Notes @ptrval 0 0 'New'

textptr はバイナリとして宣言する必要があります。textptr は、NULL ではないテキスト・フィールドに対してのみ定義します。INSERT 文を使用して、テキスト・フィールドに初期の非 NULL 値を指定できます。

offset には、正の整数値または NULL を指定できます。0 では、既存のテキストの先頭に value を挿入します。NULL では、既存のテキストの末尾に value を挿入します。

deletelenth には、正の整数値または NULL を指定できます。0 または NULL では、value を挿入する前に offset の位置から既存の文字を削除しません。正の整数では、value を挿入する前に、offset の位置から既存の文字を指定した数だけ削除します。

MSSQL BULK キーワードはサポートされません。

MSSQL WITH LOG キーワードは解析されますが、無視されます。

TRUNCATE TABLE

テーブルからすべてのデータを削除します。

TRUNCATE TABLE tablename

InterSystems SQL の TRUNCATE TABLE コマンドを呼び出して、指定されたテーブルからすべての行を削除し、RowId (ID)、IDENTITY、および SERIAL (%Counter) の行カウンタとストリーム・フィールドの OID カウンタ値をリセットします。TRUNCATE TABLE では、削除される行の数は保持されず、@@ROWCOUNT は -1 に設定されます。

1 つ以上の実行オプションをコンマ区切りリストとして指定することによって、TRUNCATE TABLE の実行方法を指定できます。これらのオプションは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_DELETE_HINT: option,option2 */ 

option には、%NOCHECK と %NOLOCK を指定できます。詳細は、InterSystems SQL の "TRUNCATE TABLE" を参照してください。

クエリ文

SELECT

SELECT  [DISTINCT | ALL] 
  [TOP [(]{ int | @var | ? | ALL}[)]]
  select-item {,select-item}
  [ [fieldname=IDENTITY(n)] INTO [#]copytable]
  [FROM tablename [[AS] t-alias] [,tablename2 [[AS] t-alias2]] ]
  [[WITH] [(] tablehint=val [,tablehint=val] [)] ]
  [WHERE condition-expression]
  [GROUP BY scalar-expression]
  [HAVING condition-expression]
  [ORDER BY item-order-list [ASC | DESC] ]

上記の SELECT 構文がサポートされています。以下の機能はサポートされていません。

  • TOP nn PERCENT または TOP WITH TIES

  • OPTION

  • WITH CUBE

  • WITH ROLLUP

  • GROUP BY ALL

  • GROUP WITH

  • COMPUTE 節

  • FOR BROWSE

TOP nn は取得する行数を指定します。InterSystems TSQL では、整数、?、ローカル変数、またはキーワード ALL の TOP nn をサポートしています。TOP の引数は、括弧 TOP (nn) で囲むことができます。これらの括弧は、解析前の置換を避けるために維持されます。SET ROWCOUNTTOP nn よりも少数の行を指定する場合は、SET ROWCOUNT 値が使用されます。以下のダイナミック SQL の例は、ローカル変数を含む TOP の使用法を示しています。

  SET sql=3
  SET sql(1)="DECLARE @var INT"
  SET sql(2)="SET @var=4"
  SET sql(3)="SELECT TOP @var Name,Age FROM Sample.Person"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  SET result=statement.%Execute()
  DO result.%Display()

select-item リストには、以下のものを含めることができます。

  • フィールド名、関数、および式。

  • $IDENTITY 疑似フィールド名。これは、RowID に割り当てられているフィールド名に関係なく、常に RowID 値を返します。

  • アスタリスク。SELECT * がサポートされます。アスタリスクは、指定したテーブルのすべてのフィールドを選択することを意味します。アスタリスクは、テーブル名またはテーブルのエイリアスで SELECT mytable.* のように修飾できます。

  • サブクエリ。

  • ストリーム・フィールド。ストリーム・フィールドでの SELECT は、開いているストリーム・オブジェクトの oref (オブジェクト参照) を返します。

INTO 節を使用して、既存のテーブルから新しいテーブルにデータをコピーできます。既定では、SELECT は、ソース・テーブルから選択されたフィールドと同じフィールド名およびデータ型で INTO テーブルを作成します。INTO テーブルが既に存在していてはいけません。以下の例に示すように、この INTO テーブルは、永続テーブルでも一時テーブルでもかまいません。

SELECT Name INTO Sample.NamesA_G FROM Sample.Person WHERE name LIKE '[A-G]%'
SELECT Name INTO #MyTemp FROM Sample.Person WHERE name LIKE '[A-G]%'
SELECT * FROM #MyTemp

以下の例に示すように、フィールドのエイリアスを使用して、INTO テーブルのフィールドに異なる名前を指定できます。

SELECT Name AS Surname INTO Sample.NamesA_G FROM Sample.Person WHERE name LIKE '[A-G]%'

INTO 節には、オプションの IDENTITY フィールド定義を含めることができます。これにより、指定したフィールドが、INTO 節によって作成されるテーブルに IDENTITY フィールド (精度 n) として追加されます。

SELECT がサブクエリである場合、または UNION の一部である場合、INTO 節は使用できません。

FROM 節は必須ではありません。FROM 節なしの SELECT を使用して、以下のようにローカル変数に値を代入できます。

DECLARE @myvar INT
SELECT @myvar=1234
PRINT @myvar

FROM 節では、以下のいずれかの構文形式を使用したテーブル・ヒントがサポートされます。

FROM tablename (INDEX=indexname)
FROM tablename INDEX (indexname)

テーブル・ヒントの前に WITH キーワードを付けたり、括弧で囲むこともできます。テーブル・ヒントのリストはコンマか空白のスペースで区切られます。次のテーブル・ヒントは解析されますが無視されます。FASTFIRSTROW、HOLDINDEX、NOLOCK、PAGLOCK、READCOMMITTED、READPAST、READUNCOMMITTED、REPEATABLEREAD、ROWLOCK、SERIALIZABLE、SHARED、TABLOCK、TABLOCKX、UPDLOCK、XLOCK。

最適化ヒントをコンマ区切りリストとして SELECT FROM 節に指定できます。これらのヒントは、コメント内で以下の固有の構文を使用して指定します。

/* IRIS_SELECTFROM_HINT: hint,hint2 */ 

hint には、%ALLINDEX、%FIRSTTABLE tablename、%FULL、%INORDER、%IGNOREINDICES、%NOFLATTEN、%NOMERGE、%NOSVSO、%NOTOPOPT、%NOUNIONOROPT、および %STARTTABLE を指定できます。詳細は、InterSystems SQL の "FROM" 節を参照してください。

WHERE 節では、AND、OR、および NOT 論理キーワードを使用できます。これにより、括弧を使用して複数の検索条件をまとめることができます。WHERE 節では、次の検索条件がサポートされています。

  • 等値比較 : = (等しい)、<> (等しくない)、< (より小さい)、> (より大きい)、<= (以下)、>= (以上)。

  • IS NULL および IS NOT NULL 比較。

  • BETWEEN 比較 : Age BETWEEN 21 AND 65 (21 および 65 は含まれる)、Age NOT BETWEEN 21 AND 65 (21 および 65 は除外)。BETWEEN は通常、数値順に照合を行う数値の範囲に使用します。ただし、BETWEEN は、任意のデータ型の値の照合順範囲に使用できます。BETWEEN は、マッチングの対象となるフィールドと同じ照合タイプを使用します。既定では、文字列データ型の照合は大文字と小文字が区別されません。

  • IN 比較 : Home_State IN ('MA','RI','CT')

  • 引用符付き文字列として指定された、LIKE および NOT LIKE 比較。比較文字列には、_ (任意の単一の文字)、% (任意の文字列)、[abc] (項目のリストとして指定されたセット中の任意の値)、[a-c] (項目の範囲として指定されたセット中の任意の値) などのワイルドカードを指定できます。InterSystems TSQL では、^ ワイルドカードはサポートされていません。WHERE CategoryName NOT LIKE 'D\_%' ESCAPE '\' のように、LIKE 比較に ESCAPE 節を含めることができます。

  • EXISTS 比較チェック : サブクエリが空のセットかどうかをテストするサブクエリで使用します。例えば、SELECT Name FROM Sample.Person WHERE EXISTS (SELECT LastName FROM Sample.Employee WHERE LastName='Smith') のように使用します。この例では、LastName='Smith' を含むレコードが Sample.Employee に存在すれば、Sample.Person からすべての Name が返されます。存在しない場合は、Sample.Person からレコードは返されません。

  • ANY および ALL 比較チェック : サブクエリおよび等値比較演算子と共に使用します。SOME キーワードは ANY の同義語です。

WHERE 節と HAVING 節の比較では、大文字と小文字は区別されません。

HAVING 節は GROUP BY 節の後に指定できます。HAVING 節は、データ・セット全体ではなく、グループに対して処理を実行できる WHERE 節に似ています。HAVING と WHERE は同じ比較を使用します。詳細は、以下の例を参照してください。

SELECT Home_State, MIN(Age) AS Youngest,
  AVG(Age) AS AvgAge, MAX(Age) AS Oldest
 FROM Sample.Person
 GROUP BY Home_State
 HAVING Age < 21
 ORDER BY Youngest

以下のダイナミック SQL の例では、テーブル・データを選択して結果セットに入れます。

  SET sql=7
  SET sql(1)="CREATE TABLE #mytest (MyId INT PRIMARY KEY,"
  SET sql(2)="LastName VARCHAR(20),"
  SET sql(3)="FirstName VARCHAR(20))"
  SET sql(4)="INSERT INTO #mytest(MyId,LastName,FirstName) VALUES (1224,'Smith','John')"
  SET sql(5)="INSERT INTO #mytest(MyId,LastName,FirstName) VALUES (1225,'Jones','Wilber')"
  SET sql(6)="SELECT FirstName,LastName FROM #mytest"
  SET sql(7)="DROP TABLE #mytest"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  SET result=statement.%Execute()
  DO result.%Display()

以下のダイナミック SQL の例では、フィールドの値を 1 つ選択してローカル変数に入れます。

  SET sql=9
  SET sql(1)="CREATE TABLE #mytest (MyId INT PRIMARY KEY,"
  SET sql(2)="LastName VARCHAR(20),"
  SET sql(3)="FirstName VARCHAR(20))"
  SET sql(4)="INSERT INTO #mytest(MyId,LastName,FirstName) VALUES (1224,'Smith','John')"
  SET sql(5)="INSERT INTO #mytest(MyId,LastName,FirstName) VALUES (1225,'Jones','Wilber')"
  SET sql(6)="DECLARE @nam VARCHAR(20)"
  SET sql(7)="SELECT @nam=LastName FROM #mytest"
  SET sql(8)="PRINT @nam"
  SET sql(9)="DROP TABLE #mytest"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  DO statement.%Execute()

ORDER BY 節は昇順 (ASC) や降順 (DESC) を指定できます。既定は昇順です。InterSystems SQL とは異なり、ORDER BY は式に指定されるサブクエリおよびクエリで使用できます。以下はその例です。

SET @var = (SELECT TOP 1 name FROM mytable ORDER BY name)

JOIN

JOIN (INNER JOIN と同等)、INNER JOIN、および LEFT JOIN がサポートされます。括弧は複数の JOIN の解析を合理化するために使用します。

Sybase の古い外部結合 *= および =* がサポートされます。

UNION

2 つ (またはそれ以上の) SELECT 文の結合がサポートされます。InterSystems TSQL は、UNION および UNION ALL をサポートします。UNION ALL を指定する場合、最初の SELECT だけが INTO テーブルを指定できます。この INTO テーブルには、定義されたテーブル、または SELECT フィールド・リストから生成された一時テーブルを指定できます。

FETCH カーソル

OPENFETCHCLOSE、および DEALLOCATE コマンドの大部分がサポートされます。以下の機能はサポートされていません。

  • OPEN/FETCH/CLOSE @local

  • NEXT 以外の修飾子が続く FETCH (修飾子は省略可能)

  • DEALLOCATE はサポートされますが、設計上、コードが生成されないので注意してください。

制御文のフロー

IF

条件が True の場合にコードのブロックを実行します。

IF コマンドは、以下に示す 4 つの構文形式でサポートされます。

IF...ELSE 構文 :

IF condition
statement
[ELSE statement]

IF...THEN...ELSE 単行構文 :

IF condition THEN statement [ELSE statement]

ELSEIF...END IF 構文 :

IF condition THEN 
statements
{ELSEIF condition THEN statements}
 [ELSE statements]
END IF

ELSE IF (SQL Anywhere) 構文 :

IF condition THEN statement
{ELSE IF condition THEN statement}
[ELSE statement]

1 番目の構文形式は、TSQL 標準形式です。THEN キーワードを使用しません。空白スペースと改行は自由に使用できます。1 つの節の中で複数の statement を指定するには、BEGIN キーワードと END キーワードを使用して、文のブロックを分ける必要があります。ELSE 節はオプションです。この構文を、以下の例に示します。

  SET sql=4
  SET sql(1)="DECLARE @var INT"
  SET sql(2)="SET @var=RAND()"
  SET sql(3)="IF @var<.5 PRINT 'The Oracle says No'"
  SET sql(4)="ELSE PRINT 'The Oracle says Yes' "
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  SET result=statement.%Execute()
  DO result.%Display()

2 番目の構文形式は、単行構文です。THEN キーワードは必須です。改行の制約により IF condition THEN statement は、すべて同一行に置く必要があります。ただし、その行に置く必要があるのは statement の最初のキーワードのみです。それ以外では、空白スペースと改行を自由に使用できます。1 つの節の中で複数の statement を指定するには、BEGIN キーワードと END キーワードを使用して、文のブロックを分ける必要があります。ELSE 節はオプションです。この構文を、以下の例に示します。

  SET sql=3
  SET sql(1)="DECLARE @var INT "
  SET sql(2)="SET @var=RAND() "
  SET sql(3)="IF @var<.5 THEN PRINT 'No' ELSE PRINT 'Yes' "
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  SET result=statement.%Execute()
  DO result.%Display()

3 番目の構文形式では、ELSEIF 節が使用できます。ELSEIF 節は指定しないことも、1 つまたは複数を指定することもできます。それぞれに、独自の condition テストがあります。IF 節、ELSEIF 節、ELSE 節内では、複数の文を指定できます。BEGIN キーワードと END キーワードは使用できますが、必須ではありません。改行の制約により、IF condition THEN と最初の statement の間に改行が必要です。それ以外では、空白スペースと改行を自由に使用できます。ELSE 節はオプションです。END IF キーワード節は必須です。この構文を、以下の例に示します。

  SET sql=14
  SET sql(1)="DECLARE @var INT "
  SET sql(2)="SET @var=RAND() "
  SET sql(3)="IF @var<.2 THEN "
  SET sql(4)="PRINT 'The Oracle' "
  SET sql(5)="PRINT 'says No' "
  SET sql(6)="ELSEIF @var<.4 THEN "
  SET sql(7)="PRINT 'The Oracle' "
  SET sql(8)="PRINT 'says Possibly' "
  SET sql(9)="ELSEIF @var<.6 THEN "
  SET sql(10)="PRINT 'The Oracle' "
  SET sql(11)="PRINT 'says Probably' "
  SET sql(12)="ELSE PRINT 'The Oracle' "
  SET sql(13)="PRINT 'says Yes' "
  SET sql(14)="END IF"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  SET result=statement.%Execute()
  DO result.%Display()

4 番目の構文形式は、SQL Anywhere と互換性があります。この構文形式では、ELSE IF 節が使用できます (キーワードの間の空白に注意してください)。ELSE IF 節は指定しないことも、1 つまたは複数を指定することもできます。それぞれに、独自の condition テストがあります。1 つの節の中で複数の statement を指定するには、BEGIN キーワードと END キーワードを使用して、文のブロックを分ける必要があります。空白スペースと改行は自由に使用できます。ELSE 節はオプションです。この構文を、以下の例に示します。

  SET sql=6
  SET sql(1)="DECLARE @var INT "
  SET sql(2)="SET @var=RAND() "
  SET sql(3)="IF @var<.2 THEN PRINT 'The Oracle says No'"
  SET sql(4)="ELSE IF @var<.4 THEN PRINT 'The Oracle says Possibly'"
  SET sql(5)="ELSE IF @var<.6 THEN PRINT 'The Oracle says Probably'"
  SET sql(6)="ELSE PRINT 'The Oracle says Yes'"
  SET statement=##class(%SQL.Statement).%New()
  SET statement.%Dialect="MSSQL"
  SET status=statement.%Prepare(.sql)
  SET result=statement.%Execute()
  DO result.%Display()

WHILE

条件が True の間、コードのブロックを繰り返し実行します。

WHILE condition BEGIN statements END

WHILE ループは BREAK キーワードにより終了します。

CONTINUE キーワードは直ちに WHILE ループの先頭に戻ります。

statements が複数のコマンドの場合は、BEGIN キーワードと END キーワードが必須になります。

以下の例は 4 つの結果セットを返します。これらの結果セットにはそれぞれ、レコードのペアが ID の昇順で含まれます。

  DECLARE @n INT;
  SET @n=0;
  WHILE @n<8 BEGIN 
        SELECT TOP 2 ID,Name FROM Sample.Person WHERE ID>@n 
        SET @n=@n+2
        END;

CASE

指定された複数の値の最初の一致から値を返します。

CASE expression WHEN value THEN rtnval
[WHEN value2 THEN rtnval2] [...]
[ELSE rtndefault]
END

WHEN value は、単純な値である必要があります。ブーリアン式にすることはできません。

ELSE 節はオプションです。満たされる WHEN 節がなく、ELSE 節が指定されていない場合、CASE 文は expression を NULL として返します。

以下に例を示します。

SELECT CASE Name WHEN 'Fred Rogers' THEN 'Mr. Rogers' 
                 WHEN 'Fred Astare' THEN 'Ginger Rogers' 
                 ELSE 'Somebody Else' END
       FROM Sample.Person 

返される値は、expression のデータ型と一致している必要はありません。

CASEWHEN NULL THEN rtnval ケースを解析しますが、無視します。

GOTO とラベル

InterSystems TSQL では、GOTO コマンドとラベルをサポートします。ラベルは、後にコロン (:) が続く有効な TSQL 識別子である必要があります。ラベルへの GOTO 参照には、コロンが含まれません。

WAITFOR

特定の時間が経過するまで、または特定の時刻まで実行を遅らせる場合に使用します。

WAITFOR DELAY timeperiod
WAITFOR TIME clocktime

timeperiod は、実行を再開するまでに待機する時間を 'hh:mm[:ss[.fff]]' として表したものです。例えば、WAITFOR DELAY '00:00:03' は 3 秒の遅延時間を示します。WAITFOR DELAY '00:03' は 3 分の遅延時間を示します。WAITFOR DELAY '00:00:00.9' は 0.9 秒の遅延時間を示します。秒の小数部の区切り文字はコロンではなく、ピリオドです。

clocktime は、実行を再開する時刻を示します (24 時間表記の 'hh:mm[:ss[.fff]] 形式)。例えば、WAITFOR TIME '14:35:00' と指定すると、午後 2 時 35 分に実行が再開されます。WAITFOR TIME '00:00:03' と指定すると、午前 0 時 0 分 3 秒に実行が再開されます。

以下のオプションはサポートされません。

  • Sybase の CHECK EVERY 節。

  • Sybase の AFTER MESSAGE BREAK 節。

  • MSSQL の RECEIVE 節。

代入文

DECLARE

ローカル変数のデータ型を宣言します。

DECLARE @var [AS] datatype [ = initval]

ローカル変数を宣言する形式のみがサポートされ、カーソル変数はサポートされません。AS キーワードはオプションです。InterSystems SQL とは異なり、ローカル変数を設定する前に、これを宣言する必要があります。

@var には、任意のローカル変数名を指定できます。Sybase のローカル変数名では、大文字と小文字が区別されます。MSSQL のローカル変数名では、大文字と小文字が区別されません。

datatype には、CHAR(12) や INT など、任意の有効なデータ型を指定できます。TEXT、NTEXT、および IMAGE データ型は許可されていません。データ型の詳細は、このドキュメントの “TSQL 構文” の章を参照してください。

オプションの initval 引数を使用すると、ローカル変数の初期値を設定できます。リテラル値に設定することも、NULL、USER、CURRENT DATE (または CURRENT_DATE)、CURRENT TIME (または CURRENT_TIME)、CURRENT TIMESTAMP (または CURRENT_TIMESTAMP)、または CURRENT_USER のいずれかに設定することもできます。DEFAULT キーワードと CURRENT_DATABASE キーワードはサポートされません。また、SET コマンドまたは SELECT コマンドを使用して、ローカル変数の値を設定することもできます。以下に例を示します。

DECLARE @c INT;
SELECT @c=100;

複数のローカル変数宣言をコンマ区切りリストとして指定することができます。それぞれの宣言に独自のデータ型と (オプションで) 独自の初期値が必要です。

DECLARE @a INT=1,@b INT=2,@c INT=3

SET

ローカル変数または環境設定に値を割り当てます。

次のようにローカル変数に値を代入します。

DECLARE @var CHAR(20)
SET @var='hello world'

環境設定にも使用されます。

SET option ON

この設定は、ストアド・プロシージャに含まれているかどうかに関係なく、解析時に即座に有効になります。別の SET コマンドによって設定が変更されるまで、設定内容は保持されます。SET をストアド・プロシージャ (SP) で指定しておき、その SP の外部や別の SP に移動しても、設定した元の値が保持されています。

以下の SET 環境設定がサポートされます。

  • SET ANSI_NULLS。許可される値は、SET ANSI_NULLS ON および SET ANSI_NULLS OFF です。ANSI_NULLS OFF の場合、(a=b OR (a IS NULL) AND (b IS NULL)) の場合は、a=b は True です。システム全体の "ANSI_NULLS" TSQL 構成設定を参照してください。

  • SET DATEFIRST integer は、週の最初の日と見なす曜日を指定します。許可される値は 1 ~ 7 で、1 が月曜日、7 が日曜日です。既定値は 7 です。

  • SET IDENTITY_INSERT。許可される値は、SET IDENTITY_INSERT ON および SET IDENTITY_INSERT OFF です。ON の場合、INSERT 文は ID フィールドの値を指定できます。この変数は、現在のプロセスに排他的に適用され、リンク・テーブルで設定することはできません。したがって、このオプションを使用するには、SET IDENTITY_INSERT と INSERT の両方を実行するプロシージャを TSQL で定義してから、ゲートウェイ経由で InterSystems IRIS でそのプロシージャをリンクして実行する必要があります。

  • SET NOCOUNT。許可される値は、SET NOCOUNT ON および SET NOCOUNT OFF です。ON に設定すると、クエリにより影響を受けた行の数を示すメッセージが抑制されます。これによりパフォーマンスを大幅に向上させることができます。

  • SET QUOTED_IDENTIFIER。許可される値は、SET QUOTED_IDENTIFIER ON および SET QUOTED_IDENTIFIER OFF です。SET QUOTED_IDENTIFIER がオンの場合、二重引用符が引用符で囲まれた識別子の区切り文字として解析されます。SET QUOTED_IDENTIFIER がオフの場合、二重引用符が文字列リテラルの区切り文字として解析されます。文字列リテラルの望ましい区切り文字は一重引用符です。システム全体の "QUOTED_IDENTIFIER" TSQL 構成設定を参照してください。

  • SET ROWCOUNT。整数に設定します。後続の SELECT、INSERT、UPDATE、または DELETE 文に影響を与え、影響を受ける行数を制限します。SELECT 文では、ROWCOUNT が TOP より優先されます。ROWCOUNT が TOP より小さい場合、ROWCOUNT 行数が返されます。TOP が ROWCOUNT より小さい場合、TOP 行数が返されます。ROWCOUNT は、その処理の実行中、または既定の動作に戻されるまで、設定が保持されます。既定の動作に戻すには SET ROWCOUNT 0 を指定します。小数値を指定すると、ROWCOUNT は、その値より大きい直後の整数値に設定されます。

  • SET TRANSACTION ISOLATION LEVEL。以下の "トランザクション文" を参照してください。

以下の SET 環境設定は解析されますが、無視されます。

  • SET TEXTSIZE integer

トランザクション文

InterSystems TSQL では、トランザクションをサポートしています (名前付きトランザクションも含みます)。セーブポイントはサポートされません。分散トランザクションはサポートされません。

SET TRANSACTION ISOLATION LEVEL

以下の形式のみをサポートします。

  • SET TRANSACTION ISOLATION LEVEL READ COMMITTED

  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

READ VERIFIED およびその他のオプションはサポートされません。

Sybase の SET TRANSACTION ISOLATION LEVEL n 整数オプション・コード (0、1、2、3) はサポートされません。

BEGIN TRANSACTION

現在のトランザクションを開始します。

BEGIN TRAN [name]
BEGIN TRANSACTION [name]

トランザクションを開始します。オプションの name 引数を使用して、名前付きトランザクション (セーブポイントとも呼ばれる) を指定できます。name 値は、リテラルで指定する必要があります。変数は使用できません。

複数の BEGIN TRANSACTION 文を発行して、入れ子になった複数のトランザクションを作成できます。@@trancount 特殊変数で、現在のトランザクション・レベルを判別できます。各トランザクション・レベルは、COMMIT 文または ROLLBACK 文で解決する必要があります。

Note:

明示的なトランザクション内にあるデータ管理言語 (DML) 文は、スキーマ検索パスを使用して未修飾テーブル名を解決することはできません

COMMIT TRANSACTION

現在のトランザクションをコミットします。

COMMIT
COMMIT TRAN
COMMIT TRANSACTION
COMMIT WORK

この 4 つの構文形式は機能的に同じです。COMMIT キーワードは、以下に示すように、これらの任意の構文形式を指します。COMMIT 文は、現在のトランザクション中に完了したすべての処理をコミットし、トランザクション・レベル・カウンタをリセットして、設定されたすべてのロックを解除します。これによりトランザクションが完了します。コミットされた処理はロールバックできません。

複数の BEGIN TRANSACTION 文で入れ子になった複数のトランザクションを作成した場合、COMMIT は、現在の入れ子になったトランザクションを完了します。トランザクションは、トランザクションの開始を表す BEGIN TRANSACTION 文を含む操作として定義されます。COMMIT を実行すると、トランザクション・レベル・カウンタが、そのトランザクションを初期化した BEGIN TRANSACTION 文の直前の状態にリストアされます。@@trancount 特殊変数で、現在のトランザクション・レベルを判別できます。

COMMIT で名前付きトランザクションを指定することはできません。COMMIT 文の一部としてトランザクション名を指定した場合、この名前の存在が解析され、エラーは発行されませんが、トランザクション名は検証されず、無視されます。

トランザクション内でないときに COMMIT が発行された場合、Sybase ではいずれの操作も実行されず、エラーも発行されません。

ROLLBACK TRANSACTION

指定したトランザクションまたはすべての現在のトランザクションをロールバックします。

ROLLBACK [name]
ROLLBACK TRAN [name]
ROLLBACK TRANSACTION [name]
ROLLBACK WORK [name]

この 4 つの構文形式は機能的に同じです。ROLLBACK キーワードは、以下に示すように、これらの任意の構文形式を指します。オプションの name 引数では、BEGIN TRANSACTION name 文で指定された名前付きトランザクションを指定します。name 値は、リテラルで指定する必要があります。変数は使用できません。

ROLLBACK は、トランザクションをロール・バックし、実行したけれどもコミットされていない作業を元に戻し、トランザクション・レベル・カウンタをデクリメントしてロックを解除します。これを使用すると、以前の一貫性のある状態にデータベースをリストアすることができます。

  • ROLLBACK は現在のトランザクション (または入れ子になった一連のトランザクション) の間に実行されたすべての作業をロールバックし、トランザクション・レベル・カウンタをゼロにリセットして、すべてのロックを解除します。これにより、データベースは、入れ子になった最も外側のトランザクションが開始される前の状態にリストアされます。

  • ROLLBACK name は、指定された名前付きトランザクション (セーブポイント) 以降に実行されたすべての作業をロール・バックし、元に戻したセーブポイントの数だけトランザクション・レベル・カウンタをデクリメントします。すべてのセーブポイントがロール・バックまたはコミットされ、トランザクション・レベル・カウンタがゼロにリセットされると、トランザクションは完了します。名前付きトランザクションが存在しない場合、または既にロール・バックされている場合、ROLLBACK は現在のトランザクション全体をロール・バックします。

トランザクション内でないときに ROLLBACK が発行された場合、Sybase ではいずれの操作も実行されず、エラーも発行されません。

SAVE TRANSACTION

InterSystems TSQL では、SAVE TRANSACTION [savepoint-name] 文は解析されますが無視されます。指定によって処理が実行されるわけではありません。

LOCK TABLE

現在のユーザがテーブルをロックできます。

LOCK TABLE tablename IN {SHARE | EXCLUSIVE} MODE [WAIT  numsecs | NOWAIT]

LOCK TABLE 文は、指定されたテーブル内のすべてのレコードをロックします。テーブルは、SHARE MODE または EXCLUSIVE MODE でロックできます。オプションの WAIT 節は、テーブル・ロックが取得されるまで待つ秒数を指定します。LOCK TABLE 文は、現在のユーザが指定されたテーブルに対してそれまで保持していたロックを直ちに解放します。

LOCK TABLE は、トランザクション内でのみ意味を持ちます。これは、現在のトランザクションが継続している間はテーブルをロックします。トランザクション内ではない場合、LOCK TABLE は何の処理も実行しません。

"テーブル参照" の説明に従って tablename を指定します。LOCK TABLE では、1 つのテーブルのロックがサポートされます。複数のテーブルのロックはサポートされません。

LOCK TABLE では、SHARE モードと EXCLUSIVE モードがサポートされます。WRITE モードはサポートされません。

LOCK TABLE では、WITH HOLD 節はサポートされません。

WAIT の時間は、秒単位の整数で指定します。LOCK TABLE では、時刻として指定された WAIT の時間はサポートされません。

プロシージャ文

以下の標準的な Transact-SQL 文がサポートされます。

CREATE PROCEDURE / CREATE FUNCTION

名前付きの実行可能なプロシージャを作成します。

CREATE PROCEDURE procname [[@var [AS] datatype [= | DEFAULT value] [,...]] [RETURNS datatype] [AS] code
CREATE PROC procname [[@var [AS] datatype [= | DEFAULT value] [,...]] [RETURNS datatype] [AS] code
CREATE FUNCTION procname [[@var [AS] datatype [= | DEFAULT value] [,...]] [RETURNS datatype] [AS] code

PROCEDURE または FUNCTION のいずれかの結果として単一スカラ値を返すことができます。OUTPUT パラメータと既定値もサポートされます。これらのコマンドは返り値の型を TSQL 型宣言から InterSystems IRIS 型記述子へ変換します。現在のところ、結果セットとテーブルを返すことはできません。

CREATE PROCEDURE または CREATE PROC のいずれかとしてサポートされます。CREATE FUNCTIONCREATE PROCEDURE によく似ていますが、ルーチン・タイプの引数値が "PROCEDURE" でなく "FUNCTION" です。

  • CREATE FUNCTION では任意の文を使用できます。

  • RETURN キーワードは CREATE PROCEDURE で使用できます。プロシージャが RETURN または RAISERROR 文を呼び出すことなく終了する場合、整数値 0 を返します。

  • WITH EXECUTE キーワード節は CREATE PROCEDURE および CREATE FUNCTION で使用できます。このキーワードは RETURN キーワードの後に記述する必要があります。

CREATE PROCEDURE は仮パラメータ・リストを指定できます。仮パラメータはコンマ区切りのリストで指定します。括弧で囲むこともできます (オプション)。パラメータ変数とそのデータ型の間の AS キーワードはオプションです。必要に応じて、DEFAULT キーワードまたは = 記号を使用して、既定値を仮パラメータに割り当てることができます。実際のパラメータ値が指定されていない場合は、この既定値が使用されます。TSQL には、入力仮パラメータにキーワード・インジケータがありません。出力仮パラメータは、OUTPUT キーワードをデータ型に続けることで指定できます。その代わりに、これらの仮パラメータの前にはオプションのキーワード IN、OUT、または INOUT を指定できます。

以下の例は、2 つの仮パラメータを使用するプロシージャ AvgAge の作成方法を示しています。

CREATE PROCEDURE AvgAge @min INT, @max INT
AS
BEGIN TRY
  SELECT AVG(Age) FROM Sample.Person
  WHERE Age > @min AND Age < @max
END TRY
BEGIN CATCH
  PRINT 'error!'
END CATCH

このプロシージャは、以下の文によって実行されます。この場合、指定された実際のパラメータ値が平均の年齢を 21 から 65 に制限します。

EXEC AvgAge 20,66

以下の例では、除算演算の結果を返すプロシージャが作成されます。RETURNS キーワードは、返り値の小数桁数を制限しています。

CREATE PROCEDURE SQLUser.MyDivide @a INTEGER, @b INTEGER, OUT @rtn INTEGER RETURNS DECIMAL(2,3)
BEGIN
SET @rtn = @a / @b;
RETURN @rtn;
END

このプロシージャは、以下の文によって実行されます。

SELECT SQLUser.MyDivide(7,3)

以下の例は、プロシージャ OurReply の作成方法を示しています。

CREATE PROCEDURE OurReply @var CHAR(16) DEFAULT 'No thanks' AS PRINT @var

パラメータなしで実行すると、OurReply により既定のテキスト (“No thanks“) が出力されます。パラメータありで実行した場合は、OurReply により、EXEC 文で指定した実際のパラメータ値が出力されます。

CREATE FUNCTIONCREATE PROCEDURE は、ストアド・プロシージャから発行できないことに注意してください。

ALTER PROCEDURE 文はサポートされません。

CREATE PROCEDURE のインポート

インポートされた TSQL ソースに CREATE PROC 文が含まれる場合は、CREATE PROC ソースを含むクラス・メソッドが作成されます。このクラス・メソッドは名前がスキーマおよびプロシージャ名に基づく既存のクラスまたは新しいクラスのいずれかに配置されます。

プロシージャが既に存在する場合は、既存の実装が置き換えられます。スキーマおよびプロシージャから生成されたクラス名に一致するクラスが既に存在する場合は、既存のクラス名が使用されます (以前に TSQL ユーティリティによって生成されている場合)。一致するクラスが存在しない場合は、スキーマおよびプロシージャ名に基づく一意のクラス名が生成されます。スキーマは既定でシステム構成で定義された既定スキーマになります。プロシージャが正常に作成されると、結果のクラスがコンパイルされます。

ロギングが要求される場合は、ソース文が、それを包むクラス名、クラス・メソッド、および生成された仮引数と共に記録されます。プロセスで発生したエラーもログに記録されます。CREATE PROC 処理中にエラーが検出され、新しいクラスが生成された場合、そのクラスは削除されます。

ALTER FUNCTION

サポートされます。WITH EXECUTE キーワード節がサポートされます。

DROP FUNCTION

1 つの関数または関数のコンマ区切りリストを削除します。

DROP FUNCTION funcname [,funcname2 [,...] ]

IF EXISTS 節はサポートされません。

DROP PROCEDURE

プロシージャまたはプロシージャのコンマ区切りのリストを削除します。

DROP PROCEDURE [IF EXISTS] procname [,procname2 [,...] ]
DROP PROC [IF EXISTS] procname [,procname2 [,...] ]

オプションの IF EXISTS 節は、存在しない procname を指定した場合のエラーを抑制します。この節を指定せずに、存在しない procname を指定すると、SQLCODE -362 エラーが生成されます。DROP PROCEDURE はアトミック処理です。指定されたすべてのプロシージャが正常に削除されるか、どれも削除されないかのどちらかになります。

RETURN

クエリまたはプロシージャの実行を停止します。引数なしとするか、もしくは引数を付けることができます。引数なしの RETURN は TRY または CATCH ブロックの終了時に使用する必要があります。プロシージャから返す場合、RETURN はオプションで整数ステータス・コードを返すことができます。ステータス・コードを指定しない場合は、空の文字列 ("") を返します。

EXECUTE

プロシージャを実行するか、TSQL コマンドの文字列を実行します。

EXECUTE [@rtnval = ] procname [param1 [,param2 [,...] ] ]

EXECUTE ('TSQL_commands')

EXEC は EXECUTE の同義語です。

  • EXECUTE procname を使用して、ストアド・プロシージャを実行できます。パラメータはコンマ区切りリストとして指定します。このパラメータ・リストは括弧で囲みません。名前付きパラメータがサポートされます。

    EXECUTE procname では、EXECUTE @rtn=Sample.MyProc param1,param2 という構文を使用して、オプションで RETURN 値を受け取ることができます。

    EXECUTE procnameCALL 文と似ています。CALL 文を使用してストアド・プロシージャを実行することもできます。CALL では、まったく異なる構文が使用されます。

    CREATE PROCEDURE Sample.AvgAge @min INT, @max INT
      AS
      SELECT Name,Age,AVG(Age) FROM Sample.Person
      WHERE Age > @min AND Age < @max
      RETURN 99
    DECLARE @rtn INT;
    EXECUTE @rtn=Sample.AvgAge 18,65
    SELECT @rtn

    指定されたプロシージャが存在しない場合、SQLCODE -428 エラー (ストアド・プロシージャが見つかりません) が発行されます。

    WITH RECOMPILE 節は解析されますが、無視されます。

    EXECUTE procname の機能であるプロシージャ変数とプロシージャ番号 (つまり ';n') はサポートされません。

  • EXECUTE (TSQL commands) を使用して、ダイナミック SQL を実行できます。TSQL コマンドは括弧で囲みます。実行する TSQL コマンドを、一重引用符で囲んだ文字列として指定します。TSQL コマンド文字列には、改行と空白を含めることができます。ダイナミック TSQL は現在のコンテキストで実行されます。

    EXECUTE('SELECT TOP 4 Name,Age FROM Sample.Person')

    または

    DECLARE @DynTopSample VARCHAR(200)
    SET @DynTopSample='SELECT TOP 4 Name,Age FROM Sample.Person'
    EXECUTE (@DynTopSample)

    以下の例は、複数の結果セットを返す EXECUTE を示しています。

    EXECUTE('SELECT TOP 4 Name FROM Sample.Person
             SELECT TOP 6 Age FROM Sample.Person')

EXECUTE IMMEDIATE

TSQL コマンドの文字列を実行します。

EXECUTE IMMEDIATE "TSQL_commands"

WITH QUOTES ON/OFF、WITH ESCAPES ON/OFF、および WITH RESULT SET ON/OFF の各ブーリアン・オプションはサポートされません。

CALL

プロシージャを実行します。

[@var = ] CALL procname ([param1 [,param2 [,...] ] ])

CALL 文は、機能的には EXECUTE procname 文と同じです。構文的には異なります。

プロシージャ・パラメータはオプションです。括弧で囲む必要があります。

オプションの @var 変数は、RETURN 文から返された値を受け取ります。ストアド・プロシージャの実行が RETURN 文で終わらない場合、@var は 0 に設定されます。

以下の例は、ストアド・プロシージャを呼び出し、2 つの入力パラメータを渡します。そして、プロシージャの RETURN 文から値を受け取ります。

DECLARE @rtn INT
@rtn=CALL Sample.AvgAge(18,34)
SELECT @rtn

その他の文

CREATE USER

CREATE USER は新しいユーザを作成します。

CREATE USER username 

この文を実行すると、InterSystems IRIS ユーザが作成され、パスワードが指定したユーザ名に設定されます。その後、管理ポータルの [システム管理] インタフェースを使用して、パスワードを変更できます。CREATE USER を使用して、パスワードを明示的に設定することはできません。

ユーザ名は、大文字と小文字が区別されません。InterSystems TSQL と InterSystems SQL は、どちらも同じ定義済みユーザ名のセットを使用します。既に存在するユーザを作成しようとすると、InterSystems IRIS はエラー・メッセージを発行します。

既定では、ユーザはいずれの特権も持っていません。ユーザに特権を付与するには、GRANT コマンドを使用します。

DROP USER 文はサポートされません。

GRANT

ユーザまたは複数のユーザのリストに特権を与えます。

GRANT privilegelist ON tablelist TO granteelist
GRANT EXECUTE ON proclist TO granteelist
GRANT EXEC ON proclist TO granteelist
  • privilegelist : 単一の特権または特権のコンマ区切りリスト。使用可能な特権は SELECT、INSERT、DELETE、UPDATE、REFERENCES、および ALL PRIVILEGES です。ALL は ALL PRIVILEGES の同義語です。ALTER 特権は直接的にはサポートされませんが、ALL PRIVILEGES によって付与される特権の 1 つです。

  • tablelist : 単一のテーブル名 (またはビュー名) あるいはテーブル名およびビュー名のコンマ区切りリスト。"テーブル参照" の説明に従ってテーブル名を指定します。

  • proclist : 単一の SQL プロシージャまたは複数の SQL プロシージャ名のコンマ区切りリスト。記述されたすべてのプロシージャが存在する必要があります。存在しないと、SQLCODE -428 エラーが返されます。

  • granteelist : 単一の grantee (特権を割り当てられるユーザ) または grantee のコンマ区切りリスト。grantee のユーザ名は "PUBLIC" または "*" になります。* を指定すると、指定した特権が既存のすべてのユーザに付与されます。CREATE USER を使用して作成されたユーザは、最初はいずれの特権も持っていません。存在しないユーザを grantee のコンマ区切りリストで指定しても、何の影響もありません。GRANT はそのユーザを無視し、指定された特権をリスト内の存在するユーザに付与します。

指定したフィールドに対する特権の指定はサポートされません。

WITH GRANT OPTION 節は解析されますが、無視されます。

特権を、既にその特権を持っているユーザに付与しても何の影響もなく、エラーが発行されることもありません。

REVOKE

ユーザまたは複数のユーザのリストから、付与した特権を取り消します。

REVOKE privilegelist ON tablelist FROM granteelist CASCADE
REVOKE EXECUTE ON proclist FROM granteelist
REVOKE EXEC ON proclist FROM granteelist

特権を、その特権を持っていないユーザから取り消しても何の影響もなく、エラーが発行されることもありません。

詳細は "GRANT" を参照してください。

PRINT

指定されたテキストを現在のデバイスに表示します。

PRINT expression [,expression2 [,...]]

expression には、一重引用符で囲んだリテラル文字列、数値、あるいは文字列または数値に解決される変数または式を指定できます。任意の数の式をコンマで区切って指定できます。

PRINT では、Sybase の arg-list 構文はサポートされません。expression 文字列内の %3! のようなプレースホルダは置換されず、リテラルとして表示されます。

RAISERROR

RAISERROR errnum 'message'
RAISERROR(error,severity,state,arg) WITH LOG

構文形式 (括弧が付く場合と付かない場合) の両方がサポートされます。RAISERROR と RAISEERROR の両方のスペルがサポートされ、同義として扱われます。RAISERROR は、@@ERROR の値を指定のエラー番号およびエラー・メッセージに設定し、%SYSTEM.Error.FromXSQL()Opens in a new tab メソッドを呼び出します。

Sybase 互換構文 (括弧なし) では、errnum エラー番号が必要です。その他の引数はオプションです。

RAISERROR 123 'this is a big error'
PRINT @@ERROR

RAISERROR コマンドはエラー状態を起こします。このエラーの検出は、ユーザ・コードに任されています。ただし、TRY ブロックの本文に RAISERROR を配置すると、制御は CATCH ブロックのペアに移ります。CATCHブロックに RAISERROR を配置すると、制御は外側の CATCH ブロック (存在する場合) またはプロシージャの出口に移ります。RAISERROR は、プロシージャの外部の例外をトリガしません。エラーのチェックは呼び出し側に任されます。

AFTER 文レベルのトリガにより RAISEERROR を実行すると、返される %msg 値に、errnum および message の値が、コンマ区切りのメッセージ文字列コンポーネントとして格納されます (%msg="errnum,message")。

Microsoft 互換構文 (括弧付き) では、error が必要です (エラー番号でも引用符付きエラー・メッセージでもかまいません)。エラー番号は、特に指定しない場合、既定で 50000 に設定されます。オプションの severity 引数および state 引数には、整数値を指定します。

RAISERROR('this is a big error',4,1) WITH LOG
PRINT @@ERROR

UPDATE STATISTICS

指定テーブルのクエリ・アクセスを最適化します。指定するテーブルは、標準テーブルでも # 一時テーブルでもかまいません (詳細は、"CREATE TABLE" を参照してください)。InterSystems IRIS では最適化のために、指定されたテーブル名の引数が $SYSTEM.SQL.Stats.Table.GatherTableStats()Opens in a new tab メソッドへ渡されます。UPDATE STATISTICSGatherTableStats() を呼び出します。他の UPDATE STATISTICS 構文はすべて、互換性維持のためだけに解析されますが、無視されます。バッチまたはストアド・プロシージャでは、指定されたテーブルの最初の UPDATE STATISTICS 文のみがテーブル・チューニングの呼び出しを生成します。詳細は、"SQL 最適化ガイド" の "テーブルのチューニング" を参照してください。

INSERTUPDATE、または DELETE の @@ROWCOUNT が 100,000 を超える場合、そのコマンドを実行すると自動的にテーブルの UPDATE STATISTICS (テーブル・チューニング) が呼び出されます。

TSQL の TRACE 構成オプションが設定されている場合、チューニングされたテーブルのレコードがトレース・ログ・ファイルに含まれます。

USE データベース

サポートされます。また、拡張機能 USE NONE を使用して、データベースなしを選択することもできます。作成時に有効となり、変換オブジェクトが (シェルやバッチのロードなどに) 存在する限り保持されます。

InterSystems 拡張機能

TSQL では、Transact-SQL 向けの多くの InterSystems 拡張機能をサポートします。移植可能なコードにインターシステムズ独自の文を記述しても問題がないようにするため、InterSystems TSQL では特殊な形式の単独行のコメントをサポートしています。これは、2 つのハイフンと垂直バーで表記します。この演算子は、Transact-SQL 実装ではコメントとして解析されますが、InterSystems TSQL では実行可能な文として解析されます。詳細は、このドキュメントの "TSQL 構文" の章の "コメント" セクションを参照してください。

TSQL には、次の InterSystems 拡張機能が含まれています。

OBJECTSCRIPT

この拡張機能により、コンパイル出力に ObjectScript コードまたは InterSystems SQL コードを含めることができます。1 行以上のインターシステムズのコードを中括弧で囲みます。

TSQL は InterSystems SQL の %STARTSWITH 述語をサポートしないので、以下のダイナミック SQL の例では OBJECTSCRIPT を使用しています。

  SET myquery = "OBJECTSCRIPT {SELECT Name FROM Sample.Person WHERE Name %STARTSWITH 'A'}"
  SET tStatement = ##class(%SQL.Statement).%New(,,"Sybase")
  WRITE "language mode set to ",tStatement.%Dialect,!
  SET qStatus = tStatement.%Prepare(myquery)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of data"

以下のダイナミック SQL の例では、OBJECTSCRIPT を使用して TSQL ルーチンに ObjectScript コードを含めます。

  SET newtbl=2
  SET newtbl(1)="CREATE TABLE Sample.MyTest(Name VARCHAR(40),Age INTEGER)"
  SET newtbl(2)="OBJECTSCRIPT {DO $SYSTEM.SQL.Stats.Table.GatherTableStats(""Sample.MyTest"") WRITE ""TuneTable Done"",!}"
  SET tStatement = ##class(%SQL.Statement).%New(,,"Sybase")
  WRITE "language mode set to ",tStatement.%Dialect,!
  SET qStatus = tStatement.%Prepare(.newtbl)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of data"

上記の例では、WRITE コマンドで新しい行 (,!) を指定しています。OBJECTSCRIPT 拡張機能では、実行後に新しい行が発行されないため、ここで指定しておく必要があります。

IMPORTASQUERY

この拡張機能では、ストアド・プロシージャをクラス・メソッドではなくクエリとして強制的にインポートします。この機能は、EXEC 文のみを含むストアド・プロシージャで使用すると便利です。InterSystems IRIS では、そのようなストアド・プロシージャがクエリかどうかをインポート時に判断できなくなるためです。

FeedbackOpens in a new tab