2012-06-21 37 views

回答

4

只需在您的WHERE條款這種情況下,像這樣:

SELECT * 
FROM dbo.Desk 
WHERE DeskName = @desk 
OR  @desk = 'All' 

如下馬丁·史密斯的意見,這種性能將不是最優的 - 如果表很小,那麼你可能更喜歡這種簡潔只是爲了清晰/維護你的T-SQL代碼,但也要看看他鏈接到的文章...

+1

即使「DeskName」被編入索引並傳遞了一個特定的「DeskName」,它也會執行完整掃描。 –

+0

我同意@MartinSmith - 在問題的評論中看到他的鏈接。在這個特定的情況下,最短的代碼可能是最糟糕的情況。一個帶有兩個查詢的IF塊實際上可以爲DeskName = @ desk場景帶來顯着的*更好的性能...... – MatBailie

+0

@Dems - 最短的代碼可能是@desk IN(DeskName,'All' )'。 –

2

As @MartinSmith指出,field = @var or @var = 'ALL'類型答案有很大的不足......

編譯存儲過程時,它會生成一個執行計劃。並且該執行計劃必須足以處理參數可能拋出的所有場景。

在這個特殊的情況下,你可能(MartinSmith肯定地說)每次掃描整個表。這是因爲這樣的執行計劃能夠滿足兩個可能的要求。

如此有效,您最終得到一個least-worst case執行計劃。


要得到你需要有兩個查詢每一種情況下(@desk = 'ALL'@desk != 'All')一個不同的計劃。這意味着,不幸的是,不再簡單的少優雅的代碼是顯著性能更好的代碼...

IF (@desk = 'ALL') 
    SELECT * FROM dbo.Desk 
ELSE 
    SELECT * FROM dbo.Desk WHERE deskName = @desk 


發表@MartinSmith的聯繫,在他的問題的評論,進入這一大堆更多詳情。根據您的SQL體驗級別,強烈推薦閱讀;它解釋了關於SQL Server行爲的lot。但它非常深入。

更簡單的方法很簡單;試試看看。

用適當的限制條件和索引爲您的目的創建一個帶有實際數據集的表。然後,爲每個可能的答案創建一個存儲過程,並對其進行測試。理想情況下使用探查器查看CPU時間,實際時間,讀取,寫入等。

您可能會看到差異很小,您可以忍受「最差」的答案,並從中獲益它對你來說是「最好的」)。

您可能會看到其中一個在實際時間中較短,但CPU時間大大增加。如果你的併發性很高,你可能會決定使用最低的CPU時間。或者,如果您的併發率較低,則CPU時間較長但實際時間較短可能更適合。


編程是美好的,所以很多considersations,交易和餘額。即使有一塊SQL作爲simpel因爲這:)

0

最好&簡單的方法:

SELECT * FROM dbo.Desk WHERE deskName = CASE WHEN @desk='All' THEN deskName ELSE @desk END 
+0

定義'最佳&容易'?它比DavidM的回答更長久,並且與MartinSmith評論中提到的相同。這是不同的,但我當然不會說它是「最快」,「最簡單」或「最短」,所以我不知道它是如何「最好」的? – MatBailie

+0

我已經說過最好的和簡單的方法,因爲一條線就完成了。這就是爲什麼它最好,最簡單。我認爲人們會發現它更容易。 –

+1

'SELECT * FROM dbo.Desk WHERE deskName = @desk OR @desk ='ALL''?現在這也是一條線。或者'SELECT * FROM dbo.Desk WHERE @desk IN(DeskName,'All')'?我不確定*一行*的想法意味着什麼。如果你想要的話,所有的SQL可以是一行。 – MatBailie

-1
Declare @Desk varchar(50) 

if @Desk = 'All' set @Desk = null 

select * from dbo.desk where deskname = coalesce(@desk, deskname) 
相關問題