2012-04-19 43 views
0

我想創建一個tsql存儲過程,它將根據某些參數輸出行。最終目標是將行移動到另一個表,這就是爲什麼我要計數 - 我想跟蹤我正在移動的行數。有兩個表格 - NotesExtraNotesExtraNotes保存來自第一個表的溢出信息。使用IF語句後無法從數據庫輸出正確的行

我正在使用if語句根據名爲NoteType的參數選擇正確的行,但我不知道如何在if內輸出正確的select語句。我知道每個if內的選擇是錯誤的說法

select * 
from dbo.Notes 
left join dbo.ExtraNotes on Notes.NoteID = dbo.ExtraNotes.NoteID 
where NoteDate <= @Date 

任何人都可以提供輸出怎麼可以正確的行和可能重組這個更好一些指針?

完整的代碼在這裏。

alter proc selectrows 
    --external variables 
    @Date datetime, 
    @NoteType varchar(2) 
as 
--internal variables 
--Count variables, before any changes 
declare @count_rowsBefore int 
declare @count_Extra_rowsBefore int 

--Count variables of selected rows to be moved 

declare @count_SelectedRows int 
declare @count_Extra_SelectedRows int 

select @count_rowsBefore = count(*) 
from dbo.Notes 

select @count_Extra_SelectedRows = count(*) 
from dbo.ExtraNotes 


if(@NoteType= 'B') 
begin 
select @count_SelectedRows = count(dbo.Notes.NoteID), @count_Extra_SelectedRows =   count(dbo.ExtraNotes.NoteID) 
     from dbo.Notes 
     left join dbo.ExtraNotes on 
     Notes.NoteID = dbo.ExtraNotes.NoteID 
     where NoteDate <= @Date 

     select * 
     from dbo.Notes 
     left join dbo.ExtraNotes on 
     Notes.NoteID = dbo.ExtraNotes.NoteID 
     where NoteDate <= @Date 
end 
else if(@NoteType = 'S') 
    begin 
    select @count_SelectedRows = count(dbo.Notes.NoteID), 
@count_Extra_SelectedRows = count(dbo.ExtraNotes.NoteID) 
     from dbo.Notes 
     left join dbo.ExtraNotes on 
     Notes.NoteID = dbo.ExtraNotes.NoteID 
     where NoteDate <= @Date 
     and NoteType = 'S' 

     select * 
     from dbo.Notes 
     left join dbo.ExtraNotes on 
     Notes.NoteID = dbo.ExtraNotes.NoteID 
     where NoteDate <= @Date 
end 
else if (@NoteType = 'M') 
begin 
select @count_SelectedRows = count(dbo.Notes.NoteID), 
@count_Extra_SelectedRows = count(dbo.ExtraNotes.NoteID) 
     from dbo.Notes 
     left join dbo.ExtraNotes on 
     Notes.NoteID = dbo.ExtraNotes.NoteID 
     where NoteDate <= @Date 
     and NoteType = 'M' 

     select * 
     from dbo.Notes 
     left join dbo.ExtraNotes on 
     Notes.NoteID = dbo.ExtraNotes.NoteID 
     where NoteDate <= @Date 
    end 
else 
    begin 
    raiserror('Please enter a valid Note Read Type= M, S or B',16,1) 
    end 

Print 'Total Number of rows: ' + cast(@count_rowsBefore as varchar(10)) 
Print 'Total Number of "Extra" rows: ' + cast(@count_Extra_RowsBefore as varchar(10)) 

Print '-----------------------------------------------' 
Print 'Total Number of rows to Move: ' + cast(@count_SelectedRows as varchar(10)) 
Print 'Total Number of "Extra" Rows to Move: ' + cast(@count_Extra_SelectedRows 
as varchar(10)) 

Output screenshot

+0

我覺得使用返回表的函數會比這裏的存儲過程更好地爲您服務。 Checkout表值函數:http://msdn.microsoft.com/en-us/library/ms191165。aspx – Zugwalt 2012-04-19 18:52:13

+0

目前還不清楚你在這裏做什麼,你現在有什麼問題以及你要求我們做什麼? – RBarryYoung 2012-04-19 18:58:05

+0

當我用M的參數運行這個例如我得到的行與Notetype M和S是錯誤的。 – karmaplus 2012-04-19 19:00:22

回答

0

目前還不清楚是什麼你正在嘗試做的。您似乎在尋找數據和關於數據的一些統計數據,但我們不知道您實際需要的數據或結構應該是什麼。把它們分解成邏輯獨立的分支會更容易嗎?繪製出你想輸出的數據可能會更簡單,併爲每個項目單獨構建代碼。

你可以澄清一下,如果你可以給出幾行的列和樣本數據,以及如果數據是通過你的代碼運行的樣本輸出。

一個建議, 如果/ then語句不會過濾任何內容,那麼您將在第二個查詢中返回比您想要的更多的數據,因爲該過濾器僅適用於每個查詢。如果這對你有意義:你已經有了一個可以用來過濾的NoteType的變量。這將正確過濾數據,並且應該替換整個if-else if語句集,因爲代碼現在使用變量直接選擇正確的數據。因此,您可以使用

select @count_SelectedRows = count(dbo.Notes.NoteID), 
     @count_Extra_SelectedRows = count(dbo.ExtraNotes.NoteID) 
    from dbo.Notes left join dbo.ExtraNotes 
    on Notes.NoteID = dbo.ExtraNotes.NoteID 
    where NoteDate <= @Date 
    and NoteType = @NoteType 

select * 
    from dbo.Notes left join dbo.ExtraNotes 
    on Notes.NoteID = dbo.ExtraNotes.NoteID   
    where NoteDate <= @Date and NoteType = @NoteType 
+0

不幸的是,手動和S系統只有兩種類型的音符類型-M。 B在我的腦海中代表「兩者」,但不應該輸入到那一列。我會嘗試將一些示例數據添加到帖子中。 – karmaplus 2012-04-19 19:09:27

+0

http://i2.photobucket.com/albums/y19/_karma_/code/ouput.png輸出截圖 – karmaplus 2012-04-19 19:24:15

0

如果您只是想對您的行進行計數,則可以使用OVER子句生成它們。如果NoteType只能是表中的S或M,那麼傳遞一個NULL並使用ISNULL(,)應該得到你想要的。下面的代碼會提取所有註釋和所有相關注釋,前兩列是每個表中源行的總計數。我知道這是示例代碼,所以我不會對select *產生任何興趣。

底部的鏈接會覆蓋OVER子句。

CREATE PROCEDURE selectRows 
    (@Date DATETIME 
     , @NoteType VARCHAR(2) -- Pass NULL for both 
    ) 
AS 
    select count(dbo.notes.noteid) 
       over() as notecount 
      , count(dbo.ExtraNotes.NoteID) 
       over() as extraNoteCount 
      , * 
    from dbo.Notes 
    left join dbo.ExtraNotes 
     on Notes.NoteID = dbo.ExtraNotes.NoteID 
    where NoteDate <= @Date 
     and NoteType = ISNULL(@NoteType, NoteType); 

您不一定需要計數的所有副本,因此標題行中的聯合可能更符合您的想法。下面的代碼將所有註釋和標題行(noteid爲空)僅記入計數:

CREATE PROCEDURE selectRows 
    (@Date DATETIME 
     , @NoteType VARCHAR(2) -- Pass NULL for both 
    ) 
AS 
    select * 
     , CAST(NULL AS INT) noteCount 
     , CAST(NULL AS INT) extraNoteCount 
    from dbo.Notes 
    left join dbo.ExtraNotes 
     on Notes.NoteID = dbo.ExtraNotes.NoteID 
    where NoteDate <= @Date 
     and NoteType = ISNULL(@NoteType, NoteType) 
    UNION ALL 
    SELECT NULL 
     , NULL -- Repeat for as many columns as are in the select * above 
     , count(dbo.Notes.NoteID) 
     , count(dbo.ExtraNotes.NoteID) 
    from dbo.Notes 
    left join dbo.ExtraNotes 
     on Notes.NoteID = dbo.ExtraNotes.NoteID 
    where NoteDate <= @Date 
     and NoteType = ISNULL(@NoteType, NoteType) 

;

http://msdn.microsoft.com/en-us/library/ms189461.aspx