2009-07-13 8 views
0

私はそれを取得できませんか?私は構文の中で "Union All"を実行する場所は見当たりません。私は何が欠けていますか?エラー:再帰的な共通テーブル式 'EmailLog'にトップレベルのUNION ALL演算子が含まれていません

CREATE PROCEDURE SapUser_NdaysBeforeExpirationNotification 
    -- Add the parameters for the stored procedure here 
(
    @AuditTypeKey nvarchar(50), 
    @TimeLapseInMonths int 
) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    With AuditResults(SapUserId) 
    AS 
    (
     Select SapUserId From Audit 
     Where TypeKey = @AuditTypeKey And DATEDIFF(month, AttemptDate, GETDATE()) < 2 
    ) 


    Select * from SapUser 
    Inner Join Audit On vw_SapUser_Retrieve.SapId <> AuditResults.SapUserId 
    Where DATEDIFF(month, OriginalTrainingDate, GETDATE()) > @TimeLapseInMonths 

END 

監査表(別名EmailLog)

CREATE TABLE [dbo].[Audit](
    [AuditId] [int] NOT NULL, 
    [TypeKey] [nvarchar](50) NOT NULL, 
    [Description] [nvarchar](250) NULL, 
    [AuditDate] [datetime] NOT NULL, 
    [SapUserId] [int] NOT NULL, 
CONSTRAINT [PK_EmailLog] PRIMARY KEY CLUSTERED 

SAPUSER表

CREATE TABLE [dbo].[SapUser](
    [SapId] [int] IDENTITY(70000,1) NOT NULL, 
    [Username] [nvarchar](10) NULL, 
    [Password] [nvarchar](50) NOT NULL, 
    [FirstLogin] [bit] NOT NULL, 
    [Roles] [tinyint] NOT NULL, 
    [Status] [nvarchar](20) NOT NULL, 
    [Title] [nvarchar](20) NULL, 
    [FirstName] [nvarchar](50) NOT NULL, 
    [LastName] [nvarchar](50) NOT NULL, 

...など

問題の詳細

SapUserとEmailLogの2つのテーブルがあります。特定の時間枠内で、ユーザーが行動を起こさなかった場合、アカウントは削除されます。だから、90,60,30,7,1日増分で私は彼らに行動を促す電子メールを送っています。

私は電子メールを送信するたびに、「監査」テーブル(emaillogだった)に記録します。すべての月が30日であるわけではないので、1人が90日間の2回の通知を受けることが可能かもしれません。これを防ぐために、監査テーブルに行を挿入しています。

電子メールのアカウントを見つけるためにルーチンを実行すると、最初にN(90,60,30など)日以内に電子メールを送信し、考慮から除外する監査テーブルのすべてのアカウントを見つけています。

+0

EmailLogはどこに入りますか?このエラーは、EmailLogという名前のCTEが必要であると思われるようです。しかし、CTE AuditResultsを使用するようにも思われません...同義語を使用していますか? – gbn

+0

悪いですが、私はEmailLogをAuditに改名しました。上記のコードで古いテーブル名への参照をすべて削除しました。 –

答えて

1

、あなたが持っている:

Select * from SapUser 
Inner Join Audit On vw_SapUser_Retrieve.SapId <> AuditResults.SapUserId 
Where DATEDIFF(month, OriginalTrainingDate, GETDATE()) > @TimeLapseInMonths 

これは、CTEのAuditResults呼ば唯一の時間であり、それは表のように、機能しないようにする必要があります。この行の "Audit"が "AuditResults"(そしてSapUserはおそらくvw_SapUser_Retrieveである)でなければなりません。

とにかく、それは間違って使用されているCTEを参照することによって引き起こされ、エラーメッセージは誤解を招く可能性があります。

とにかく修正しましたが、何が間違っているかが分かります。

+0

見てくれてありがとう! –

+0

実際、私はビュー "vw_SapUser_Retrieve"から*を選択するつもりでした。遅かった。 –

1
With EmailLog(SapUserId) 
AS 
(
    Select SapUserId 
    From EmailLog 
    Where TypeKey = @EmailLogKey 
    And DATEDIFF(month, AttemptDate, GETDATE()) < 2 
) 

これは再帰的なCTEです。再帰的なCTEには特定の形式があり、achro共用体からすべての再帰的な部分(結合内)を選択します。正しい場合はFROMを確認しますか? SapUserでなければならないのでしょうか?

+0

5k rep woot、寝る –

+0

おめでとうございます! –

0

CTEを削除して1つのSQL文を作成しました。私はこれが同じことだと信じています.CTEは理解しやすくなりました。うまくいけば、私はこの単一のSQL文を正しいと思います。元のコードで

Select * from vw_SapUser_Retrieve 
Inner Join Audit On vw_SapUser_Retrieve.SapId = Audit.SapUserId 
Where DATEDIFF(month, OriginalTrainingDate, GETDATE()) > @TimeLapseInMonths AND (Audit.TypeKey <> @AuditTypeKey OR (Audit.TypeKey = @AuditTypeKey AND DATEDIFF(month, Audit.AuditDate, GETDATE()) > 2)) 
関連する問題