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] ]
INTO 節には、オプションの IDENTITY フィールド定義を含めることができます。これにより、指定したフィールドが、INTO 節によって作成されるテーブルに IDENTITY フィールド (精度 n) として追加されます。
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 カーソル
OPEN、FETCH、CLOSE、および 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 のデータ型と一致している必要はありません。
CASE は WHEN 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 秒に実行が再開されます。
以下のオプションはサポートされません。
代入文
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 環境設定は解析されますが、無視されます。
トランザクション文
InterSystems TSQL では、トランザクションをサポートしています (名前付きトランザクションも含みます)。セーブポイントはサポートされません。分散トランザクションはサポートされません。
SET TRANSACTION ISOLATION LEVEL
以下の形式のみをサポートします。
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 文で解決する必要があります。
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 FUNCTION は CREATE 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 FUNCTION と CREATE 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 procname は CALL 文と似ています。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')