ちょっと変わったマニアな作品が集結

お世話になっております。

T-SQLで、以降のコマンドを実行したくない(強制終了したい)場合は、どのように書けばよいのでしょうか?
例えば、[SQL文1]でエラーが発生した場合、[SQL文2]を実行したくない状況です。<A>の箇所はどうすればよいでしょうか?

[SQL文1]
GO
IF @@ERROR<>0
<A>

[SQL文2]
GO

よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

私の環境ではreturnで問題ないみたいです


逆に
IF @@ERROR = 0
BEGIN
[SQL文2]
END
とすればよいのではないでしょうか?もしくは
IF @@ERROR = 0
 GOTO ENDLABEL

[SQL文2]

ENDLABEL:
最終行にラベルを定義してgotoで抜ける方法もあります
    • good
    • 2

returnです

この回答への補足

returnはその位置では使えないと言われてしまいます。ストアド内でしか、使えないのではないでしょうか。
仕方ないので、RAISEERRORでレベル20以上のエラーを発生させて強制終了させる事で対処しました。

補足日時:2006/02/16 14:44
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q処理件数を非表示にしたい

ManagementStudioでストアドプロシージャの開発をしています

開発中、デバッグのためにプロシージャをコールすると、SQLの発行の度に
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
・・・

と処理件数が表示され、確認の際に邪魔で困っています。
処理件数を非表示にするにはどうすれば良いでしょうか?

また同様に、SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にできないでしょうか?

Aベストアンサー

処理件数を非表示にする方法

⇒SELECT文の前に「set nocount on」を記載すると件数は表示されません。

SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にする方法

⇒デバッグのためには表示された方が良いと思いますが、
 とりあえず…SELECT文の前に「SET NOEXEC ON」を記載するとデバッグだけ実施され、
 グリッドは表示されません。
例であげると以下のとおりです。
SET NOCOUNT ON
SET NOEXEC NO
SELECT *
FROM DB.dbo.TableName
go

Q文字列をsplitするSQL文を教えて下さい

SQLServer2000上で指定した文字で文字列をsplitような関数があれば教えて頂けますか?

例えば"12345.6789"という文字列を"."(ピリオド)を指定して、"12345"と"6789"という2つの文字列を取得したいと思っています。

Transact-SQLの関数リファレンスを見てみたのですが、適当なものが見つかりませんでした。
自作するしかないのでしょうか・・

Aベストアンサー

見当たりませんね~。

declare @str1 nvarchar(1),@str2 nvarchar(50)
select @str1 =N'.',@str2 = N'12345.6789'
select
substring(@str2,1,charindex(@str1,@str2)-1) as 前,
substring(@str2,charindex(@str1,@str2)+1,len(@str2)-charindex(@str1,@str2)) as 後

こんな感じにしかできないみたいです

QSQLServerのストアドで戻り値取得したい。

こんにちわ。
いまSQLServer2005でストアドを作成しています。
あるテーブルをSELECTして,あるカラムと件数の両方を出力パラメータに取得したいのですが,
件数は取得できるのですが,カラムが取得できません。
ちなみに下記のようなコードになります。
create procedure funLoginCheck (@UserID char(5), @PassWord varchar(10), @RowCount int output, @DeptID char(2) output)
as select * from MST_Employee
where EmployeeID = @UserID And PassWord = @PassWord; set @deptid = deptid」
deptidを出力パラメータに渡す方法がわかりません。
初歩的なことかもしれませんが,
教えてください。よろしくお願いします。

Aベストアンサー

>deptidを出力パラメータに渡す方法

select @deptid=deptid from MST_Employee
where EmployeeID = @UserID And PassWord = @PassWord

という方法で渡せます。
ところで、この条件でヒットするのは1行だけなのでは?
パラメタ=@RowCountの目的が、よく分かりませんが?
それに今の記述では、@RowCountには何も設定されていません。システムから返される@@ROWCOUNTの内容を、設定したいのでしょうか?

プロシジャとファンクションの定義と実行例を、参考までに示します。

1.プロシジャ
(1)定義
create procedure dbo.funLoginCheck
(@UserID char(5),
@PassWord varchar(10),
@RowCount int output,
@DeptID char(2) output)
as
select @DeptID=deptid
from MST_Employee
where EmployeeID=@UserID
And PassWord=@PassWord
set @RowCount=@@ROWCOUNT

(2)実行
declare @dept char(2)
declare @rowcnt int
exec dbo.funLoginCheck @UserID='U1',@PassWord='P1',
@RowCount=@rowcnt output,@DeptID=@dept output
select @rowcnt,@dept

2.ファンクション
(1)定義
create function dbo.funLoginCheck
(@UserID char(5),
@PassWord varchar(10))
returns char(2)
begin
declare @DeptID char(2)
select @DeptID=deptid
from MST_Employee
where EmployeeID=@UserID
And PassWord=@PassWord
return @DeptID
end

(2)実行
select dbo.funLoginCheck('U2','P2')

>deptidを出力パラメータに渡す方法

select @deptid=deptid from MST_Employee
where EmployeeID = @UserID And PassWord = @PassWord

という方法で渡せます。
ところで、この条件でヒットするのは1行だけなのでは?
パラメタ=@RowCountの目的が、よく分かりませんが?
それに今の記述では、@RowCountには何も設定されていません。システムから返される@@ROWCOUNTの内容を、設定したいのでしょうか?

プロシジャとファンクションの定義と実行例を、参考までに示します。

1.プロシジャ
(1)定義
...続きを読む

QSQLserverのIF文について

どうしてもIF文がうまくいきません
IF文の中にIFを入れ子していますそのIFが複数の条件があります
今までACCESSではELSEIFで条件をいくらでも指定できたのですがSQLの場合はエラーになってしまいます
ご教授おねがいします
------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER FUNCTION [dbo].[scfc_part端数処理]
( @PTHASU nvarchar(10), @haken nvarchar(10) )
RETURNS
real
AS
BEGIN
DECLARE @PARTT real
DECLARE @PARTT_H real

if (not(@PTHASU is null))
if @haken='派遣' or @haken='臨時'
if substring(@PTHASU,4,2)>= 50
SET @PARTT = convert(int,LEFT(@PTHASU,2)+1)*60
--ここをいれるとエラー IF substring(@PTHASU,4,2)< 50 and substring(@PTHASU,4,2)>= 20
--ここをいれるとエラー SET @PARTT = convert(int,LEFT(@PTHASU,2)*60 +30
--ここをいれるとエラー if substring(@PTHASU,4,2)< 20
--ここをいれるとエラー SET @PARTT = convert(int,LEFT(@PTHASU,2)*60
ELSE
SET @PARTT = convert(real,LEFT(@PTHASU,2))*60 + convert(real,substring(@PTHASU,4,2))*1

ELSE
SET @PARTT= 0

SET @PARTT_H = convert(real,(floor(@PARTT/60*10000)/10000))

RETURN @PARTT_H

END

どうしてもIF文がうまくいきません
IF文の中にIFを入れ子していますそのIFが複数の条件があります
今までACCESSではELSEIFで条件をいくらでも指定できたのですがSQLの場合はエラーになってしまいます
ご教授おねがいします
------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER FUNCTION [dbo].[scfc_part端数処理]
( @PTHASU nvarchar(10), @haken nvarchar(10) )
RETURNS
real
AS
BEGIN
DECLARE @PARTT real
DECLARE @PARTT_H real

if (not(@PTHASU is...続きを読む

Aベストアンサー

マニュアルを読みましょう。

if 条件
真の時の命令文
else
偽の時の命令文

で、真または偽で命令文を2個以上書く場合は、begin~endでブロックを構成する必要があります。

参考URL:http://msdn2.microsoft.com/ja-jp/library/ms182717.aspx

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qsqlcmdでクエリの実行結果をバッチの環境変数に入れる方法について

数字の場合は、&quot;exit(select 3);&quot;を実行するとerrorlevelに入ってきます。
文字の場合はどのようにしてバッチの環境変数に入れるのでしょうか?

Aベストアンサー

for /f "delims=" %%A in ('sqlcmd ~~~') do set A=%%A
echo %A%

QSQLServer2005のストアドプロシージャで変数を配列で使用する方法をご教示ください

タイトルの件。調査したのですが、変数を配列でとる方法(宣言の仕方や使用方法)が見つけられませんでした。
ご存知の方、ご教示いただけませんでしょうか?
できれば使用方法が書かれた本やサイトをご紹介いただけると助かります。
それともSQLServer2005のストアドプロシージャでは変数を配列で使用することはできないのでしょうか?
(そんなことはないと思うのですが、探しても出てこないのが不思議です。私の検索方法が悪いからだと思いますが)

以上です。よろしくお願いします。

Aベストアンサー

SQL Serverのストアドプロシージャでは
昔からの仕様で変数には配列が存在しません。

しかしながら、SQL Server 2005はXMLを使用して
配列的に引数を渡すことができます。

http://blogs.sqlpassj.org/yoneda/archive/2005/05/14/9008.aspx

また、内部変数を配列的に使用したければ代わりに、
Table型変数やCursorまたはCursor型変数の使用ができるので、
こちらで配列的な処理が可能でしょう。
(ただし膨大なデータ量だとパフォーマンス劣化の恐れがあります)

QSELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?

初めてこちらで質問させていただきます。
どうぞよろしくお願いします。
早速ですが、
現在ストアドファンクション(PL/pgSQL)にて以下のような形になっています。
変数d1,d2,d3に値をセットするにあたり
テーブルt1を3回スキャンしています。
これを1回のスキャンでセットするような
方法はないのでしょうか?

DECLARE
d1 integer;
d2 integer;
d3 varchar(10);

begin
select min(c1) into d1 from t1;
select min(c2) into d2 from t1;
select min(c3) into d3 from t1;
各種処理
return v;
end;

気持ち的には以下のようなSQLを書きたいのですが、
syntax error となります。
(NG例)
select min(c1) into d1,min(c2) into d2,min(c3) into d3 from t1;

何か良い案がありましたら教えてください。
「それは出来ません」と言う回答でもありがたいです。
※あきらめがつくので。。

それではよろしくお願いします。

初めてこちらで質問させていただきます。
どうぞよろしくお願いします。
早速ですが、
現在ストアドファンクション(PL/pgSQL)にて以下のような形になっています。
変数d1,d2,d3に値をセットするにあたり
テーブルt1を3回スキャンしています。
これを1回のスキャンでセットするような
方法はないのでしょうか?

DECLARE
d1 integer;
d2 integer;
d3 varchar(10);

begin
select min(c1) into d1 from t1;
select min(c2) into d2 from t1;
select min(c3) into ...続きを読む

Aベストアンサー

select min(c1),min(c2),min(c3) into d1,d2,d3 from t1;
でダメ?

QMS SQLServer のSQLで文字列の前にN:

MS SQLServer のSQLで文字列の前にN: をつけることをよく見かけますが、
「N:」とはいったいどんな意味なのでしょうか?
教えて下さい。

Aベストアンサー

T-SQLでの話かと思いますが・・・。NCHAR/NVARCHAR型という、型(タイプ)があるのですが、これらは、夫々、national character/national character varying(SQL-92での表記法)の意味を持っています。夫々、固定長文字列(Unicode)/可変長文字列(Unicode)です。
NVARCHARはSQL-Server2000では4000文字まで、VARCHAR2は8000文字まで格納可です。(つまり、1/2になるということです)

さて、N'***' とT-SQL内で書くと、''内の文字をUnicodeで表現されたものとして処理する、という意味になります。Nは、nationalの略です。ですから、日本語を使おうとするとNは必須になる、という事ですね。

こんな感じでつかいます。#N'Unicode 文字列'

QEXISTSを使ったDELETE文

「SELECT文の件数」と、
「同じSELECT文を使ったDELETE文の件数」が一致しない現象が起き、困っています。

【SELECT文】※2件返ってきます。
SELECT
  a.部署コード,
  a.社員コード
FROM
  社員マスタ a,
  組織マスタ b
WHERE
  a.部署コード = b.部署コード


【DELETE文】※50件 DELETEされます。
DELETE TABLE
  社員マスタ
WHERE
  EXISTS
  (
  SELECT
    a.部署コード,
    a.社員コード
  FROM
    社員マスタ a,
    組織マスタ b
  WHERE
    a.部署コード = b.部署コード
  )


環境はSQLSERVER2005です。
件数はSQLSERVER2005のカウントオプションで表示されているものなので間違いないです。

宜しくお願いします。

Aベストアンサー

EXISTS 句は、副問い合わせが行を返した場合 TRUE そうでない場合 FALSE と評価されます。

例示いただいた副問い合わせは TRUE を返すので DELETE されます。

詳細については、SQLの入門書を参考にしてください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング