我正在寫一個網站上使用的查詢。當需要查詢時,它直接被解析到服務器,結果全部由查詢控制。該網站只是返回表格。我在網站上做的是客戶端可以選擇的複選框,並將這些複選框解析爲查詢@var = 1
或@var = 0
。正因爲如此,現在我有這個代碼來檢查和添加或不取決於它是否被檢查。我的問題是,有沒有更好的辦法去這比使用IF
聲明是這樣,因爲我有代碼的幾個部分,其中包括這樣的:比使用IF更適合這種情況嗎?
SET @sql = 'select distinct '
If @mgchk = 1
SET @sql = @sql + 'p.MainGroup'
If @sgchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.SubGroup'
If @sgchk = 1 and @sql not like '%SubGroup'
SET @sql = @sql + ',p.SubGroup'
If @ssgchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.SubSubGroup'
If @ssgchk = 1 and @sql not like '%SubSubGroup'
SET @sql = @sql + ',p.SubSubGroup'
If @Seasonchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.Season'
If @Seasonchk = 1 and @sql not like '%Season'
SET @sql = @sql + ',p.Season'
If @vendorchk = 1 and @sql = 'select distinct '
SET @sql = @sql + 'p.VendorID'
If @vendorchk = 1 and @sql not like '%VendorID'
SET @sql = @sql + ',p.VendorID'
SET @sql =
@sql +
' into
##aa
from
RPProducts p,
RPIv i,
RPTrsd d,
RPTrs s
WHERE
s.StoreID = d.StoreID and
s.ReceiptNO = d.ReceiptNO and
i.UPC = d.UPC and
i.StoreID = d.StoreID and
i.IVProduct = p.Productid and
s.TRSdate >= '''+ convert(varchar(10), @trsfrom, 101) +''' and
s.TRSdate <= '''+ convert(varchar(10), @trsto, 101) +''''
execute sp_executesql @sql
@mgchk/@sgchk/@ssgchk/@seasonchk/@vendorchk是複選框變量
要回答@Aaron,
全局臨時因爲動態查詢。整個查詢得到處理並在數據被拖動時立即丟棄。沒有衝突會發生在那裏。
我的日期變量是datetime
,它在動態SQL中給我一個錯誤。
是的,回想一下同樣的事情來檢查,這是整個問題的原因,如果有更好的使用比IF
檢查。
,我發現使用別名連接更容易...
哦哇,這麼多東西在這裏挑選...全球##臨時表,爲什麼?日期爲區域字符串,爲什麼?爲什麼要檢查你添加的列是否是第一個?舊式連接,爲什麼? – 2013-02-28 15:28:47
@AaronBertrand - 更新後的答案 – JohnZ 2013-02-28 15:39:09
你有沒有試過讓兩個用戶同時運行這個存儲過程?關於你稱之爲「別名連接」的內容 - [請閱讀本文全文,包括評論](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using -old的風格,joins.aspx)。 – 2013-02-28 15:40:39