sql >> Databáze >  >> RDS >> Sqlserver

ANSI_NULLS a QUOTED_IDENTIFIER zabily věci. Na co jsou?

OK, z pohledu vývojáře aplikace tato nastavení dělají toto:

QUOTED_IDENTIFIER

Toto nastavení řídí způsob uvozovek ".." jsou interpretovány kompilátorem SQL. Když QUOTED_IDENTIFIER je ON, pak se s uvozovkami zachází jako se závorkami ([...] ) a lze jej použít k uvozování názvů objektů SQL, jako jsou názvy tabulek, názvy sloupců atd. Když je vypnuto (nedoporučuje se), pak se s uvozovkami zachází jako s apostrofy ('..' ) a lze jej použít k citování textových řetězců v příkazech SQL.

ANSI_NULLS

Toto nastavení řídí, co se stane, když se pokusíte použít jiný operátor porovnání než IS na NULL. Když je zapnuto, tato porovnávání se řídí standardem, který říká, že porovnávání s NULL vždy selže (protože to není hodnota, je to příznak) a vrací FALSE . Když je toto nastavení VYPNUTO (opravdu ne doporučeno) můžete s ním úspěšně zacházet jako s hodnotou a použít = , <> , atd. na něm a získat zpět TRUE podle potřeby.

Správný způsob, jak to zvládnout, je místo toho použít IS (ColumnValue IS NULL .. ).

CONCAT_NULL_YIELDS_NULL

Toto nastavení řídí, zda jsou hodnoty NULL "Propogate" použity v řetězcových výrazech. Když je toto nastavení ZAPNUTO, řídí se standardem a výrazem jako 'some string' + NULL .. vždy vrátí NULL. V sérii zřetězení řetězců tedy může jedna hodnota NULL způsobit, že celý výraz vrátí hodnotu NULL. Vypnutí tohoto (také se nedoporučuje) způsobí, že hodnoty NULL budou místo toho považovány za prázdné řetězce, takže 'some string' + NULL vyhodnotí se pouze jako 'some string' .

Správný způsob, jak to vyřešit, je pomocí funkce COALESCE (nebo ISNULL):'some string' + COALESCE(NULL, '') .. .



  1. Zápis rekurzivního CTE pomocí syntaxe Entity Framework Fluent nebo Inline syntaxe

  2. Připojení PDO bez názvu databáze?

  3. Jak nainstalovat drahokam pg PostgreSQL na Ubuntu?

  4. Jak otestovat, zda je SimpleXML nainstalován na mém PHP nebo ne?