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?

TSQL コマンド

この章では、以下のグループでサポートされている TSQL コマンドについて説明します。

データ定義言語 (DDL) 文

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

CREATE TABLE

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

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

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

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

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

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

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

Caché 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 は解析されますが、無視されます。

テーブル制約節 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 は互換性を保つために解析されますが無視されます。

CHECK 列制約はサポートされません。CHECK 制約が TSQL ソースのコンパイル中に見つかった場合、Caché はエラー・メッセージを生成して 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()

ALTER TABLE

ALTER TABLE 文は、テーブル、そのフィールド、データ型、および制約を変更できます。

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

ALTER TABLE <tablename> ADD <colname> <datatype> [DEFAULT <value>] [{UNIQUE | NOT NULL} | CONSTRAINT <constraintname> {UNIQUE | NOT NULL} ]
ALTER TABLE <tablename> ALTER COLUMN <colname> <newdatatype>
ALTER TABLE <tablename> REPLACE <colname> DEFAULT { <constant> | USER | NULL }
ALTER TABLE <tablename> DROP COLUMN <colname>
ALTER TABLE <tablename> ADD <tableconstraint> FOR <colname>
ALTER TABLE <tablename> DROP <tableconstraint>
ALTER TABLE <tablename> DROP FOREIGN KEY <role>
ALTER TABLE <tablename> ADD CONSTRAINT <constraint> DEFAULT <defaultvalue> FOR <colname> 
ALTER TABLE <tablename> ADD CONSTRAINT <constraint> FOREIGN KEY
ALTER TABLE <tablename> DROP CONSTRAINT <constraint>
ALTER TABLE <tablename> DISABLE

ALTER TABLE...ADD に既定値も指定する場合は、NOT NULL 制約のみを指定できます。ALTER TABLE...ADD でサポートされる完全な構文は、次のとおりです。

ALTER TABLE <tablename> 
   [ WITH CHECK | WITH NOCHECK ]
  ADD <colname> <datatype> [DEFAULT <value>] [{UNIQUE | NOT NULL} | CONSTRAINT <constraintname> {UNIQUE | NOT NULL} ]
  [ FOREIGN KEY (col1[,col2[,...]])
     REFERENCES table(col1[,col2[,...]]) ]

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

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

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

ALTER TABLE...DROP COLUMN : キーワード DELETE はキーワード DROP の同義語です。

DROP TABLE

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

DROP TABLE [IF EXISTS] tablename [,tablename2 [,...] ]

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

オプションの IF EXISTS 節は、存在しない、一時テーブルではない tablename を指定した場合のエラーを抑制します。

CREATE INDEX

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

CREATE INDEX indexname ON tablename(fieldname)

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

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

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

  • ASC/DESC キーワード

  • INCLUDE 節

  • WITH 節インデックスのすべてのオプションコンマで区切られた WITH 節のオプションのリストは、必要に応じて括弧で囲むことができます。このリストには、フラグ・オプションの設定 =ON または =OFF を含めることができます。

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

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

  • DATA 節

  • VIRTUAL キーワード

  • 列名に代わる関数名の使用

DROP INDEX

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

DROP INDEX table.index [,table.index]

DROP INDEX index ON table [WITH (...)] [,index ON table [WITH (...)] ]

table にはインデックス・フィールドを含むテーブル名、index にはインデックス名を指定できます。

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

CREATE TRIGGER

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

CREATE TRIGGER trigger_name {BEFORE | AFTER} 
{INSERT | DELETE | UPDATE [OF col1[,col2[,...]]]}
[ORDER integer]
ON table-name
[ REFERENCING OLD [ROW] [AS] name |
                                NEW [ROW] [AS] name |
                                OLD TABLE [AS] identifier |
                                NEW TABLE [AS] identifier ][,...]
[FOR EACH {ROW | STATEMENT}]
[WHEN (condition)]
[LANGUAGE {TSQL | SQL |OBJECTSCRIPT}]
triggered statement
[WITH EXECUTE]

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

Caché TSQL では BEFORE トリガをサポートしています。これは他のベンダの Transact-SQL ソフトウェアではサポートされていない TSQL に対する、Caché 特有の拡張機能です。

DROP TRIGGER

トリガ定義を削除します。単一のトリガ、またはコンマ区切りのトリガのリストを削除できます。

CREATE VIEW

CREATE VIEW [owner.]view_name [(colname1 [,colname2 [,...]])]
    [WITH ENCRYPTION | SCHEMABINDING | VIEW_METADATA]
    AS select_statement
   [WITH CHECK OPTION]

view_name は、一意の TSQL 識別子にする必要があります。既にビューが存在している場合は、SQLCODE -201 エラーが発行されます。view_name は、区切り文字付き識別子にできます。例えば、CREATE VIEW "Name/Age View" のようにできます。

ビュー列の名前の指定には、2 つの方法があります。

  • コンマで区切られたオプションの colname リストを使用して、SELECT 文で返される対応するテーブルの列にビュー列名を指定できます。

    CREATE VIEW NameAgeV (FullName,Years)
    AS SELECT Name,Age FROM Sample.Person
  • SELECT 文で列のエイリアスを指定でき、これらのエイリアスがビュー列名として使用されます。

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

どちらも指定していない場合は、テーブルの列名がビュー列名として使用されます。

WITH 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 の既定値を使用して Caché SQL にバインドします。

DROP VIEW

ビュー定義を削除します。単一のビュー、またはコンマ区切りのビューのリストを削除できます。DROP VIEW は、全か無かの操作ではありません。これは、ビューのリストから既存のビューを削除し、ビューのリスト内に存在しないビューは無視します。

CREATE DATABASE

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

データベースを添付し、データベース・スナップショット構文オプションを作成する MSSQL はサポートされません。

DROP DATABASE

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

データ管理言語 (DML) 文

DELETE

テーブルからデータ行を削除します。DELETEDELETE FROM の両方がサポートされます。以下を除く他のオプションがすべてサポートされています。

  • FROM テーブル・ヒント

  • 行セット関数

  • OPTION

  • 結合ヒント

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

  • 主テーブルのヒント

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

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

INSERT

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

INSERT column VALUES list_of_values
INSERT column SELECT select_statement

対応する Sybase list_of_values および SELECT の構文形式がサポートされます (Sybase では VALUES キーワードを使用しません)。

以下を除きすべてのオプションがサポートされています。

  • 値節として EXECUTE

  • 行セット関数

  • DEFAULT VALUES

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

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

UPDATE

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

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

以下を除く、すべての UPDATE オプションがサポートされています。

  • 行セット

  • OPTION

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

  • テーブル・ヒント

UPDATE では、SET 節の左側でローカル変数を使用することをサポートしています。このローカル変数は、列名に代わるもの、または列名に追加するものです。以下の例では、列名に SET、ローカル変数に SET、列名とローカル変数の両方に SET が示されています。

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

SET の左側にローカル変数が指定されている場合は、右側を DEFAULT にすることはできません。

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

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

以下のダイナミック 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()

READTEXT、UDATETEXT、WRITETEXT

READTEXT は、テーブルの列からのストリーム・データを返します。これは、TEXTPTR 関数を使用して取得できる、有効なテキスト・ポインタ値が必要です。

UPDATETEXT は、テーブルの列からのストリーム・データを更新します。これは、TEXTPTR 関数を使用して取得できる、有効なテキスト・ポインタ値が必要です。

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

TRUNCATE TABLE

TRUNCATE TABLE tablename

指定したテーブルからすべての行を削除します。WHERE 節のない DELETE FROM table と同じ機能の範囲で使用できます。ただし、TRUNCATE TABLE では RowId (ID)、IDENTITY、または SERIAL (%Counter) の行カウンタはリセットされません。InterSystems SQL TRUNCATE TABLE コマンドが、これらのカウンタをリセットします。

クエリ文

SELECT

SELECT  [DISTINCT | ALL] 
  [TOP [(]{ int | @var | ? | ALL}[)]]
  select-item {,select-item}
  [INTO #temptable]
  [FROM table [[AS] t-alias] [,table2 [[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 は取得する行数を指定します。Caché 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()

テーブル・ヒントは以下のいずれかの構文形式でサポートされます。

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 * がサポートされます。アスタリスクは、指定したテーブルのすべての列を選択することを意味します。アスタリスクは、テーブル名またはテーブルのエイリアスで SELECT mytable.* のように修飾できます。

SELECT クエリの選択リストの中に、サブクエリを含めることができます。

選択リストに、ストリーム・フィールドを含めることができます。ストリーム・フィールドでの SELECT は、開いているストリーム・オブジェクトの oref (オブジェクト参照) を返します。

TSQL の SELECT に、FROM 節は不要です。FROM 節なしの SELECT を使用して、以下のようにローカル変数に値を代入できます。

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

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

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

INTO 節を使用して、テーブルへの入力値を選択できます。以下の例に示すように、このテーブルを永続テーブルまたは一時テーブルとすることができます。

SELECT name,age INTO #MyTemp FROM Sample.Person
SELECT name,age FROM #MyTemp WHERE name LIKE '[A-D]%'

INTO テーブルが存在していない場合は、SELECT がこれを生成します。

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

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] (項目の範囲として指定されたセット中の任意の値) などのワイルドカードを指定できます。Caché 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()

JOIN

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

Note:

Caché TSQL では、外部結合に以下の記号表現を使用します。

=*   Left Outer Join
*=   Right Outer Join

これらは Caché SQL の使用法に対応します。これらは、SQL Server および Sybase 結合構文とはまったく逆 (=* は右外部結合) です。このシンボル構文ではなく、ANSI 標準キーワード構文を使用して、外部結合を表示することを強くお勧めします。

UNION

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

FETCH カーソル

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

  • OPEN/FETCH/CLOSE @local

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

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

UPDATE STATISTICS

指定テーブルのクエリ・アクセスを最適化します。Caché では最適化のために、指定されたテーブル名の引数が $SYSTEM.SQL.TuneTable()Opens in a new tab メソッドへ渡されます。UPDATE STATISTICS により、$SYSTEM.SQL.TuneTable() が update=1 かつ display=0 で呼び出されます。返される %msg は無視され、KeepClassUpToDate の既定値は False となります。他の UPDATE STATISTICS 構文はすべて、互換性維持のためだけに解析はされますが、無視されます。バッチまたはストアド・プロシージャでは、指定されたテーブルの最初の UPDATE STATISTICS 文のみが $SYSTEM.SQL.TuneTable() の呼び出しを生成します。

制御文のフロー

IF

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

WHILE コマンドがサポートされます。条件が True のときに、コードを実行します。

WHILE condition BEGIN statements END

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

CASE

CASE 文がサポートされます。ELSE 節は、オプションです。WHEN 節が満たされず ELSE 節が指定されない場合、CASE 文は式を NULL に設定します。

GOTO とラベル

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

WAITFOR

Caché TSQL では、次の 2 つの WAITFOR コマンドの形式をサポートします。

WAITFOR DELAY timeperiod
WAITFOR TIME clocktime

timeperiod は、実行が再開されるまで待機する時間を示します ('hh:mm[:ss[.fff]] 形式)。例えば、WAITFOR DELAY '00:00:03' は 3 秒の遅延時間を指定することになります。WAITFOR DELAY '00:03' は遅延時間が 3 分になります。

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

代入文

DECLARE

ローカル変数のデータ型を宣言するために使用します。

DECLARE @var [AS] datatype [ = initval]

ローカル変数を宣言する形式のみがサポートされ、カーソル変数はサポートされません。

@var には、任意のローカル変数名を指定できます。ローカル変数名では、大文字と小文字は区別されません。datatype には、CHAR(12) や INT などの任意の有効なデータ型を指定できます。オプションの initval 引数を使用すると、ローカル変数の初期値を指定できます。

データ型の詳細は、このドキュメントの “TSQL 構文” の章を参照してください。

SET

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

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

システム設定にも使用されます。

この設定は、ストアド・プロシージャに含まれているかどうかに関係なく、解析時に即座に有効になります。別の 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 です。

  • SET DATEFIRST number

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

  • 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 がオフの場合、二重引用符が文字列リテラルの区切り文字として解析されます。文字列リテラルの望ましい区切り文字は一重引用符です。

  • 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 DATEFORMAT

  • SET TEXTSIZE

トランザクション文

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

SET TRANSACTION ISOLATION LEVEL

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

  • SET TRANSACTION ISOLATION LEVEL READ COMMITTED

  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.

BEGIN TRANSACTION

BEGIN TRAN [name]
BEGIN TRANSACTION [name]

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

COMMIT TRANSACTION

COMMIT
COMMIT TRAN
COMMIT TRANSACTION
COMMIT WORK

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

トランザクションは、トランザクションの開始を表す BEGIN TRANSACTION 文を含む操作として定義されます。COMMIT を実行すると、トランザクション・レベル・カウンタが、そのトランザクションを初期化した BEGIN TRANSACTION 文の直前の状態にリストアされます。

単一の COMMIT により、すべての名前付きトランザクションがコミットされます。

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 は現在のトランザクション全体をロール・バックします。

CHECKPOINT

Caché TSQL では、CHECKPOINT 文は解析されますが無視されます。指定によって処理が実行されるわけではありません。

LOCK TABLE

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

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

プロシージャ文

以下の標準的な 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 型宣言 から Caché 型記述子へ変換します。現在のところ、結果セットとテーブルを返すことはできません。

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 は、ストアド・プロシージャから発行できないことに注意してください。

CREATE PROCEDURE のインポート

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

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

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

ALTER FUNCTION

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

DROP FUNCTION

サポートされます。

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

プロシージャを実行します。必要に応じてパラメータを渡します。

EXECUTE procname [param1 [,param2 [,...] ] ]
EXEC procname [param1 [,param2 [,...] ] ]

EXECUTE (または EXEC) 文は以下のようにサポートされます。

  • EXEC <procedure> を使用して、ストアド・プロシージャを実行できます。EXEC キーワードは省略できません。名前付きパラメータがサポートされます。現在、EXEC <procedure> 機能であるプロシージャ変数とプロシージャ番号 (つまり ';n') はサポートされていません。WITH RECOMPILE は許可されますが無視されます。

    CREATE PROCEDURE ProcTopSample
    AS SELECT TOP 4 Name,Age FROM Sample.Person
    GO
    EXEC ProcTopSample
    GO

    以下の例では、Caché が提供するプロシージャ Sample.PersonSets を実行します (2 つのパラメータを渡しています)。

    EXECUTE Sample.PersonSets 'F','VT'

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

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

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

CALL

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

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

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

その他の文

CREATE USER

CREATE USER は新規のユーザ ID およびパスワードを作成します。この文の実行により、指定のユーザ名にパスワードが設定された Caché ユーザを作成します。

ユーザ名は、大文字と小文字が区別されません。Caché TSQL と Caché SQL は、どちらも同じ定義済みユーザ名のセットを使用します。

CREATE ROLE

CREATE ROLE は新しいロールを作成します。ロールは複数のユーザに割り当てることができる名前付きの特権セットです。1 つのロールを複数のユーザに割り当てることも、また複数のロールを 1 人のユーザに割り当てることもできます。以下の構文がサポートされます。AUTHORIZATION 節はオプションです。

CREATE ROLE rolename AUTHORIZATION auth

GRANT および REVOKE

GRANT privilegelist ON (columnlist) TO granteelist
  • privelegelist : 単一の特権、またはコンマ区切りの特権のリスト。利用できる特権は、ALL、EXECUTE、SELECT、INSERT、DELETE、UPDATE、および REFERENCES です。

  • columnlist : 1 つの列名、またはコンマ区切りの列名のリスト(括弧で囲む)。GRANT 文の末尾に、括弧で囲んだ列名のリストを指定できます。SELECT 特権および UPDATE 特権の場合は、その特権キーワードに続けて、括弧で囲んだ列名のリストを指定できます。

  • granteelist : 単一の grantee (特権の受け取り人)、またはコンマ区切りの grantee のリスト。grantee のユーザ名は "PUBLIC" または "*" になります。

REVOKE コマンドを使用して、付与されている特権を明示的に削除できます。

REVOKE privilegelist ON (columnlist) FROM granteelist CASCADE

PRINT

サポートされます。

RAISERROR

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

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

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

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

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

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

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

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

UPDATE STATISTICS

サポートされます。クエリ・パフォーマンスを最適化します。UPDATE STATISTICS は Caché $SYSTEM.SQL.TuneTable()Opens in a new tab メソッドの呼び出しを生成し、テーブル名を渡します。詳細は、"Caché SQL 最適化ガイド" の "テーブルのチューニング" を参照してください。

USE データベース

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

InterSystems 拡張機能

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

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

CACHE

この拡張機能により、コンパイル出力に ObjectScript コードを含めることができます。ObjectScript の 1 行または複数行を中括弧で囲みます。

CACHE {WRITE "SQLCODE=",SQLCODE,!}

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

また、CACHE 拡張機能を使用して、Caché SQL を TSQL コードに埋め込むこともできます。

CACHE {&sql(SET TRANSACTION %COMMITMODE EXPLICIT)}

埋め込み Caché SQL の詳細は、"Caché SQL の使用法" の "埋め込み SQL" を参照してください。

IMPORTASQUERY

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

FeedbackOpens in a new tab