0

私はストアド プロシージャの使用に慣れていないので、2 つの質問に出くわしました。

まず、なぜ私はこれを行うことが許可されていないのですか? エラーメッセージは次のとおりです。

オペランド型の衝突: date は int と互換性がありません

コード :

@time date OUTPUT

SELECT @time = ranking_date 
FROM [dbo].[t_ranking] 
WHERE ranking_date <= DATEDIFF(day, @todaysDateminusthirty, @todaysdate) 
  AND ranking_keyword = @keyword
  AND ranking_id_doman = @domainID

結果を完全なデータセットとして返すにはどうすればよいですか? 2 つの変数に保存する代わりに?または、複数の行を保持できますか?

ALTER PROCEDURE [dbo].[fetchRankingData]
-- Add the parameters for the stored procedure here
@domannamn [varchar](100),
@keyword [varchar](100),
@rankingen [decimal](6,2) OUTPUT,
@time date OUTPUT

AS
DECLARE @domainID int
DECLARE @todaysDateminusthirty datetime
DECLARE @todaysdate datetime

BEGIN
SET NOCOUNT ON;

IF EXISTS(SELECT 1 FROM [dbo].[t_doman] WHERE doman_namn = @domannamn)
BEGIN
set @todaysdate = getdate()
set @todaysDateminusthirty = DATEADD(day,-30,@todaysdate)

SELECT @domainID = doman_id FROM [dbo].[t_doman] WHERE doman_namn = @domannamn

IF EXISTS(SELECT 1 FROM [dbo].[t_ranking] WHERE ranking_id_doman = @domainID AND ranking_keyword = @keyword)
BEGIN   
    SELECT @rankingen = ranking_position FROM 
        [dbo].[t_ranking] WHERE   ranking_keyword = @keyword 
            AND ranking_id_doman = @domainID
    SELECT @time = ranking_date FROM 
        [dbo].[t_ranking] WHERE ranking_date <= DATEDIFF(day,@todaysDateminusthirty,@todaysdate) AND ranking_keyword = @keyword
            AND ranking_id_doman = @domainID    
END 
END
END
4

2 に答える 2

2

まず第一に、なぜ日付を日数と比較するのですか? それがDATEDIFF(DAY, ...)本質的に返されるものであり、2 つの日付間の日数です。おそらくあなたが意味した

ranking_date <= @todaysDateminusthirty

また

ranking_date <= @todaysdate

または(さらに良い、おそらく)

ranking_date BETWEEN @todaysDateminusthirty AND @todaysdate

2番目の問題については、いいえ、行をスカラー変数に格納することはできません、ストアドプロシージャに結果セットを返すようにさせることはできます.行を返すSELECTステートメントを使用するだけです(変数を初期化するステートメントとは対照的に)。つまり、つまり、「通常の」SELECT ステートメントです。

あなたのストアドプロシージャの目的は私にはあまり明確ではないので、以下の私の提案はそれとうまく相関しないかもしれません. でも、宿題もやらなければならないので、それもいいかもしれませんね。適切な出発点が必要な場合があるだけで、次のものが (うまくいけば) それを提供するはずです。

SELECT
  ranking_position,
  ranking_date
FROM dbo.t_ranking
WHERE ranking_keyword = @keyword
  AND ranking_date BETWEEN DATEADD(day, -30, GETDATE()) AND GETDATE()
  AND ranking_id_doman IN (
    SELECT doman_id FROM dbo.t_doman WHERE doman_namn = @domannamn
  )
;

@todaysDateminusthirtyand@todaysdateをクエリ内の対応する式に直接置き換えたことがわかります。これらの変数が必要だと思われる場合 (たとえば、この手順を拡張して、体の他の部分で変数を再利用することを考えている場合) は、そのままにしておいてください。ただし、そのままでは、ストアド プロシージャはそれらを必要としないようです。

チェックも必要ないことにも注意してください。IF EXISTSどの時点でも一致しない場合 ( no @domannamnint_domanまたは no @keywordin t_ranking)、結果は空のデータセットになります。そして、それは問題ないはずです。この SP を呼び出すモジュールは、その場合を考慮して、結果セット内の行の存在をチェックする必要があります。

最終的に、宣言全体は次のようになります。

ALTER PROCEDURE [dbo].[fetchRankingData]
@domannamn [varchar](100),
@keyword [varchar](100)
/* the OUTPUT parameters are removed as no longer needed apparently */
AS
/* no apparent need for additional variables either */
BEGIN

SET NOCOUNT ON;

SELECT
  ranking_position,
  ranking_date
FROM dbo.t_ranking
WHERE ranking_keyword = @keyword
  AND ranking_date BETWEEN DATEADD(day, -30, GETDATE()) AND GETDATE()
  AND ranking_id_doman IN (
    SELECT doman_id FROM dbo.t_doman WHERE doman_namn = @domannamn
  )
;

END

この機会に、ストアド プロシージャのトピックについてマニュアルなどでもっと読み始めることをお勧めします。オンライン ブックは、改善を開始するのに十分な優れた資料を提供するはずです。また、StackOverflow をブラウジング/検索することも悪い考えではありません。

于 2012-11-02T10:26:22.760 に答える
1

うまくいきました..!

where ranking_date >= dateadd(mm, datediff(mm, 0, getdate())+0, 0)
and ranking_date < dateadd(mm, datediff(mm, 0, getdate())+1, 0)
于 2012-11-02T10:22:42.030 に答える