2011-06-24 23 views
0

我在SQL Server中的通用存儲過程2005 DB空值的頂部()的參數存儲過程

它返回產品項目的名單在網站上使用,我想使它更可重複使用的跨越該網站,所以我可以用它來返回特定數量的產品。

存儲過程需要一個num項目參數來限制返回的項目數量,但我想知道是否有一種方法,我可以讓存儲過程接受一個空值參數,而不必訴諸維護兩條select語句或2個存儲過程。

這裏有一個剝離下來的例子用了WHERE子句等中多餘的東西..

create procedure GET_PRODUCTS 
    @num_items int = null 
as 
    select TOP(@num_items) prod_id, prod_name, prod_price 
    from products 

end 

的問題是,我該如何選擇的所有記錄,如同上面子句中的情況下空是不存在被傳遞給proc。

我有幾個想法,但我不確定他們在SQL Server性能方面的大小,這正是我想評估的內容?

1)我可以檢查,如果參數是零,如果是重新分配給一個非常大的整數,它應比記錄的金額在表中(目前約5000和生長)

2)同每次但每次上面計算的產品表的大小

回答

1

使用IF,並創建兩個查詢:

create procedure GET_PRODUCTS 

@num_items int = null 

as 
IF @num_items IS NULL 
    select prod_id,prod_name, prod_price from dbo.products 
ELSE 
    select TOP(@num_items) prod_id,prod_name, prod_price from dbo.products 

GO 

也得到總是使用表的模式(dbo或其他)的習慣它爲查詢計劃提供了更好的重用性。

+1

謝謝,但在我的崗位用於維護的原因上面提到我不想要做到這一點。 說這個查詢比我提供的維護這個查詢的2個版本的簡單例子更復雜,然後變得更加困難! –

+1

在SQL的世界裏,你需要絕對的性能,你會發現重複的代碼是不可避免的。爲了讓單個代碼片段成爲所有交易的一部分,您最終會損害性能。對於快速查詢,我已經看到了一些小的,幾乎微不足道的變化,這些變化只會影響他們的性能。 –

1

我認爲你已經過分複雜了。如果你想要所有的行都不告訴它要獲取多少個!只要做到:

IF @Num_Items IS NULL 
BEGIN 
    SELECT prod_id,prod_name, prod_price from products 
END 
ELSE 
<Your existing code> 

編輯:

如果你絕對要使用TOP條款,只需將其分配給像2147483647一個非常高的價值。這是int數據類型的最高可能值。查詢分析器不會嘗試返回那麼多行,但它會確保它不會返回比您指定的更多的更多,它應該不會影響性能。

+0

根據我最後的評論和最初的帖子,這不是我真正想做的事情。 –

+0

@carrot - 我看到了你對另一個答案的評論,請參閱我的編輯 – JNK

+2

只是爲了記錄:儘管'2147483647'確實是int的最高值,通常TOP表達式[轉換爲bigint](http: //msdn.microsoft.com/en-us/library/ms189463.aspx)(即當它沒有PERCENT時)。 –

0

您可以使用動態查詢:

create procedure GET_PRODUCTS 

@num_items int = null 

as 
declare @sql nvarchar(max) 

set @sql = N'select ' 
if @num_items is not null 
    set @sql = @sql + 'TOP(@num_items) ' 

set @sql = @sql + 'prod_id,prod_name, prod_price from products' 

execute sp_executesql @sql 
    ,N'@num_items int = null' 
    ,@num_items 
end 
0

你可以做

select TOP(@num_items) prod_id, prod_name, prod_price 
    from products where @num_items is not null 
union 
select prod_id, prod_name, prod_price 
    from products where @num_items is null 

,或者你可以

select TOP(isnull(@num_items,Very large number)) prod_id, prod_name, prod_price 
    from products