1

次のコードがあります。実行すると印刷されます

メッセージ 8120、レベル 16、状態 1、手順テスト、行 17
列 '@t.Country' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。エラー'

'ERROR'しかし、私は印刷されたいだけです。エラーメッセージを抑制する方法はありますか?

ありがとうサティアプラカシュJ

CREATE PROCEDURE Test
AS
    DECLARE @t TABLE
        (ID INT IDENTITY(1,1)
        ,Country NVARCHAR(50)
        ,Year INT
        ,PopulationInMillions INT
        )

    INSERT @t (Country, Year, PopulationInMillions)
    VALUES ('US', 2000, 20),
           ('US', 2001, 22) 

    SELECT Country, MAX(PopulationInMillions)
    FROM @t       
GO

BEGIN TRY
    EXEC Test
END TRY
BEGIN CATCH
    PRINT 'ERROR'
END CATCH
4

4 に答える 4

1

エラーが実際にブロック内で発生TRYした場合は、はい、できます-あなたが示したとおりです:

BEGIN TRY
    RAISERROR('Hello!',16,1)
END TRY
BEGIN CATCH
    PRINT 'ERROR'
END CATCH

印刷するだけERRORです。同様に:

create procedure P
AS
    RAISERROR('World!',16,1)
GO
BEGIN TRY
    EXEC P
END TRY
BEGIN CATCH
    PRINT 'ERROR'
END CATCH

また、単に印刷しERRORます。

しかし、他の人があなたに伝えようとしたように、 /を入力する前にエラーが発生した場合、TRY/をどのように構成しても問題ありません。また、 /内にプロシージャを作成CATCHする簡単な方法はありません。TRYCATCH

于 2012-11-23T14:04:14.467 に答える
0

ここには 2 つの問題があります。

主な問題は、マーティン・スミスが指摘したように、あなたの誤りはcreate procedure声明から来ているということです. からではありませんexec。さらに詳しく説明すると、これは、group by (ing) なしでは列と集計関数を選択できないことを示す解析およびコンパイルエラーです。これを行う。

SELECT Country, MAX(PopulationInMillions)
    FROM @t
    GROUP BY Country --add this line

しかし、たとえあなたが(そうしようとして)しても

begin try
    DECLARE @t TABLE
        (ID INT IDENTITY(1,1)
        ,Country NVARCHAR(50)
        ,Year INT
        ,PopulationInMillions INT
        )

    INSERT @t (Country, Year, PopulationInMillions)
    VALUES ('US', 2000, 20),
           ('US', 2001, 22) 

    print N'Before error';

    SELECT Country, MAX(PopulationInMillions)
    FROM @t
    --GROUP BY Country    --comment in attempt to cause error

    print N'After error';

end try
begin catch
    print N'Caught error';
end catch

print N'Before error';エラー メッセージ 8120 は、解析およびコンパイル時に返される致命的なエラーであるためです。バッチ全体が実行されることさえありません。

これは、クエリがどのように処理されるかを理解するための良い記事ですhttp://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/

そして、TRY...CATCH がまだなかった時代の良い記事があります。しかし、致命的/非致命的なSQLエラーを理解するための良い情報源. http://www.sqlteam.com/article/handling-errors-in-stored-procedures

于 2014-05-22T04:57:21.983 に答える
0

エラーメッセージを抑制する方法はありますか?

はいあります。

クエリを修正します。

SELECT Country, MAX(PopulationInMillions)
FROM @t    

そのようです:

  • GROUP BY country次のように追加します。

    SELECT Country, MAX(PopulationInMillions)
    FROM @t 
    GROUP BY Country;
    

    または、

  • 集計関数を次のように使用しますCountry

    SELECT Max(Country), MAX(PopulationInMillions)
    FROM @t 
    

    または、

  • リストCountryからフィールドを削除します。SELECT

    SELECT MAX(PopulationInMillions)
    FROM @t    
    

GROUP BY節がどのように機能するかについてもっと読む必要があると思います。グループ化が SQL でどのように機能するかを理解することは非常に重要です。

于 2012-11-22T12:19:39.930 に答える
0

上記のストアド プロシージャ作成ステートメントを修正することが、エラー メッセージを抑制する唯一の方法です。

構文が間違っているため、create procedure ステートメントでエラーが発生しています。ストアド プロシージャがデータベースに作成されることはありません。プロシージャが存在しないため、begin try はストアド プロシージャを実行していません。テキスト エラーを表示するには、EXEC {anything} を try に入れることができます。

于 2012-11-22T15:27:53.400 に答える