Robię SELECT
który wykorzystuje CASE
przekonwertować wartości nvarchar do odpowiedniego typu, coś takiego:SPRAWA TO klauzula zawsze oceniana
SELECT CASE
WHEN @propType = 'money' THEN convert(money, datavalue)
[...]
ELSE datavalue
END
FROM [...]
Jednak wydaje się, że convert
jest wykonywane zawsze, nawet gdy @propType
jest nie równa pieniędzy. Działający przykład:
declare @proptype nvarchar(50)= 'nvarchar'
declare @val nvarchar(10) = 'test'
select
case @proptype
when 'money' then convert(money, @val)
else @val
end
Dlaczego tak jest i jak mogę się z nim obejść? W dokumentacji MSDN mówi tak:
Oświadczenie CASE ocenia swoje warunki sekwencyjnie i zatrzymuje z pierwszego warunku, którego warunek jest spełniony. W niektórych sytuacjach wyrażenie jest oceniane przed wykonaniem instrukcji CASE , która otrzymuje wyniki wyrażenia jako dane wejściowe. Błędy w oceny tych wyrażeń są możliwe. Wyrażenia zbiorcze, które pojawiają się w WHEN argumenty do instrukcji CASE są oceniane najpierw, a następnie dostarczone do instrukcji CASE. Na przykład następujące zapytanie powoduje dzielenie przez błąd zerowy przy wytwarzaniu wartości agregatu MAX . Występuje to przed oceną wyrażenia CASE.
Nie jestem pewien, czy to ma znaczenie, ale język jest nieco ciężki dla obcokrajowców, więc może tak jest?
Jedynym celem wyraźnie konwersji '' money' varchar' do kiedy to implicitely przekształcany z powrotem do 'varchar' jest AFAIK tak celom formatowania dlaczego nie można też przechowywać je w wymaganym formatowaniu zacząć z lub pozwolić klientowi obsługiwać formatowanie? –
Dane źródłowe nie są pod moją kontrolą. W rzeczywistości muszę przeskoczyć przez kilka kółek, aby uzyskać dane w takim formacie, że mogę wstawić je do tabeli raportu, do której jest przeznaczone (co jest poprawnie wpisane). – carlpett