2016-05-23 4 views
1

ASP.NETでWebポータルを構築しているため、私たちの環境で発生する、当社独自のプラットフォームのセキュリティイベントを追跡できます。エラーが発生してもストアドプロシージャ内で複数のクエリを実行する

データは本当に単純です。我々はそれを収集し、かなり基本的なテーブルにそれをログに記録:

CREATE TABLE [dbo].[tblBonks] 
(
    [bonkID] [int] IDENTITY(1,1) NOT NULL, 
    [bonkVictim] [nvarchar](50) NOT NULL, 
    [bonkMachineID] [nvarchar](max) NULL, 
    [bonkUser] [nvarchar](50) NOT NULL, 
    [bonkTime] [datetime] NOT NULL, 

    CONSTRAINT [PK_tblBonks] 
     PRIMARY KEY CLUSTERED 
) 

私は私のコードは、24時間、7day、および1ヶ月の統計を収集するために呼び出すストアドプロシージャを持っています。私が設定した変数@Scoreboardに応じて、ストリングを渡して、ストアドプロシージャに異なるスコアボードの統計情報を生成させることができます。
これはすべてかなり簡単です。ここで

は、それが今存在するストアドプロシージャです:

CREATE PROCEDURE sp_BuildScoreboard 
    @ScoreBoard nvarchar(25), 
    @Day nvarchar(5) OUTPUT, 
    @Week nvarchar(5) OUTPUT, 
    @Month nvarchar(5) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF (@ScoreBoard = 'VICTIM') 
    BEGIN 
     set @Day = (select TOP(1) bonkVictim, count(bonkVictim) as bonknumber 
        from tblBonks 
        where bonkTime > DATEADD(DAY, -1, SYSDATETIME()) 
         and bonkVictim != bonkUser 
        group by bonkVictim 
        order by bonknumber desc) 

     /* 7 days */ 
     set @Week = (select TOP(1) bonkVictim, count(bonkVictim) as bonknumber 
        from tblBonks 
        where bonkTime > DATEADD(WEEK, -1, SYSDATETIME()) 
         and bonkVictim != bonkUser 
        group by bonkVictim 
        order by bonknumber desc) 

     /* 1 month */ 
     set @Month = (select TOP(1) bonkVictim, count(bonkVictim) as bonknumber 
         from tblBonks 
         where bonkTime > DATEADD(MONTH, -1, SYSDATETIME()) 
         and bonkVictim != bonkUser 
         group by bonkVictim 
         order by bonknumber desc) 
    END 
    /*ELSE IF (@ScoreBoard = 'LEADER') 
    BEGIN 
    END 
    ELSE IF (@ScoreBoard = 'MACHINE') 
    BEGIN 
    END*/ 
END 
GO 

私はこれが何らかの理由で動作しないことを学んできましたが。これらは、独自の値を出力変数に返す3つの独立したクエリでなければなりません。

Msg 116, Level 16, State 1, Procedure sp_BuildScoreboard, Line 38
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

Msg 116, Level 16, State 1, Procedure sp_BuildScoreboard, Line 41
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

Msg 116, Level 16, State 1, Procedure sp_BuildScoreboard, Line 42
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

私はT-SQLで超弱いよ:

は、私はこのエラーを取得します。これらのエラーを検索すると、私と完全に関連していないいくつかの問題が発生します。私は間違って何をしていますか?

答えて

1

まず、各ステートメントの最後にセミコロンを入れてください。これは問題ではありません(この場合)。サブクエリがスカラー副問合せであることを

 set @Day = (select TOP(1) bonkVictim 
        from tblBonks 
        where bonkTime > DATEADD(DAY, -1, SYSDATETIME()) and 
          bonkVictim <> bonkUser 
        group by bonkVictim 
        ORDER BY count(bonkVictim) desc 
        ); 

注:代わりに、文法的に正しい文を書きます。 1つの列と最大で1つの行だけを戻すことができます。 2つの列でエラーが発生するはずです。

+0

構文に関するヒントをありがとう。そして、私の質問の書き換え。あなたの例のように更新され、完全に動作します! –

0

selectステートメントからbonkVictim,を削除する必要があります。そのため、selectステートメントは1行と1列だけを返します。

関連する問題