2012-11-05 14 views
5

Próbuję ustawić podobny parametr w zmiennej i zezwolić tej zmiennej na akceptację dzikich kart (mssql 2005). Jeśli użyję mojego zestawu parametrów do "%", to zwraca tylko częściowy podzbiór, ale jeśli twarde kodowanie kwerendy do użycia '%' zwróci pełny zestaw. Dlaczego zmienna może zachowywać się inaczej niż łańcuch?Zdeklarowana zmienna zachowuje się inaczej na sztywno zakodowanym łańcuchu

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 '%'; 

Pełne scenariusz jest przełączanie oparte na fladze ale jest powtarzalne pod kodem powyżej

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; 

Dzięki

+1

@wareno jest równe '% 000' –

+3

Ale co próbujesz zrobić? nie określiłeś, które ciągi do porównania używają predykatu 'LIKE', po prostu' like '%' 'Why ?? –

+0

W rzeczywistości przełączam @wareno między wartością preentered i wildcard na podstawie innej flagi. W niektórych scenariuszach muszę zastąpić wprowadzoną wartość i wybrać cały wareno – Joe

Odpowiedz

9

Zmienna char(4) zostanie wypełniona się z trzema końcowymi przestrzeniami.

Są to significant in a LIKE pattern i będą pasować tylko do wartości kończących się na trzy spacje. Zamiast tego użyj varchar(4).

+0

bingo. Dzięki: D – Joe

+0

Martin: Myślałem, że Sql Server używa innego 'wykonywania' jeśli wartość jest obecna w czasie' kompilacji' lub jeśli jest 'nieznana' .Jeśli wartość jest znana, serwer sql generuje optymalny plan na podstawie statycznego wartość else to szacuje 'liczba wierszy'. Czy mam rację? – praveen

+0

@praveen - To jest (rodzaj) prawda, ale nie wpływa na pytanie OP. Jeśli wartość jest parametrem, zostanie ona wciągnięta i skompilowana zgodnie z pierwszą przekazaną wartością. Jeśli jest to zmienna, SQL Server użyje ogólnych oszacowań. Dla 'OPTION (RECOMPILE)' można użyć, aby uwzględnić rzeczywistą wartość runtime. –

Powiązane problemy