2012-11-05 47 views
5

我想將一個類似參數設置爲一個變量並允許該變量接受通配符(mssql 2005)。如果我使用我的參數集'%'它只返回一個子集,但如果我硬編碼查詢使用'%'它將返回完整的集合。爲什麼變量的行爲可能與字符串不同?聲明變量的行爲與硬編碼字符串不同

DECLARE @wareno char(4); 
SET @wareno = '%'; 
select @wareno as a, * from waredesc where wareno like @wareno; 

VS

DECLARE @wareno char(4); 
SET @wareno = '%'; 
select @wareno as a, * from waredesc where wareno like '%'; 

完整場景基於標誌切換但高於

DECLARE @wareno char(4); 
DECLARE @delprods bit; 

/** 
SET THESE PARAMETERS 
**/ 
SET @wareno = '1'; 
SET @delprods = 'true'; /** if true all the warehouses should also be emptied for safety - products are held at a company level!**/ 

IF @delprods = 1 
BEGIN 
    SET @wareno = '%'; 
END 
select @wareno as a, * from waredesc where wareno like @wareno; 

由於

+1

@wareno等於'%000' –

+3

但是你想要做什麼?你沒有指定使用'LIKE'謂詞比較哪些字符串,就像'%''爲什麼? –

+0

我實際上是在預先設定的值和基於另一個標誌的通配符之間切換@wareno。在某些情況下,我需要覆蓋輸入的值並選擇所有wareno – Joe

回答

9

char(4)變量將被填充出代碼下可再現的有三個尾隨空間。

這些是significant in a LIKE pattern它只會匹配以三個空格結尾的值。改爲使用varchar(4)

+0

賓果。感謝:D – Joe

+0

Martin:我認爲Sql Server使用不同的'執行',如果該值存在於編譯時或者它是未知的。如果該值已知,則sql服務器根據靜態生成最佳計劃值,否則它估計''行數'。我是嗎? – praveen

+0

@praveen - 這是(種)真實的,但不影響OP的問題。如果該值是一個參數,則會根據傳遞的第一個值進行嗅探和編譯。如果它是一個變量,SQL Server將只使用一般估計值。對於「OPTION(RECOMPILE)」,可以用它來考慮實際的運行時間值。 –

相關問題