KB981037 – JAVÍTÁS: A "Kísérlet egy nem NULL-képes oszlop értékének NULL-ra állítására" hibaüzenet jelenik meg, amikor olyan lekérdezést futtat, amely az ISNULL() függvényt használja egy nullázható oszlop értékeinek kiválasztására a SQL Server 2008-ban

A Microsoft egyetlen letölthető fájlként terjeszti a Microsoft SQL Server 2008 javításait. Mivel a javítások egymásra épülnek, minden új kiadás tartalmazza az összes gyorsjavítást és minden biztonsági javítást, amely az előző SQL Server 2008-javításban szerepelt.

Tünetek

Vegyük például a következő esetet:

  • A Microsoft SQL Server 2008-ban futtatni kell egy olyan lekérdezést, amely az ISNULL() függvényt használja a nullázható oszlopban lévő értékek kiválasztására.
  • A nullázható oszlopot tartalmazó táblázat illesztése a nullázható oszlopnál lévő másik táblával történik.
  • A Query Optimizer által létrehozott lekérdezésterv kivonat-illesztést, sort vagy rendezési táblát használ a JOIN operátor alatt.

Ebben az esetben a következő hibaüzenet jelenik meg:

Megjegyzés

Msg 681, Level 16, State 3, Line 2

Kísérlet egy nem NULL-képes oszlop értékének NULL értékre állítására.

Ok

A Query Optimizer megállapítja, hogy az ISNULL() függvényben hivatkozott oszlop nem nullázható, mivel az illesztési operátor elutasítja a NULL értékeket. Ezután a lekérdezési tervben a Query Optimizer a JOIN operátor alá helyezi az ISNULL() függvényben található kifejezést. A kifejezés értéke NULL is lehet. A Query Optimizer azonban nem nyeri vissza újra a kifejezés nullázhatósági tulajdonságát. Ezután a lekérdezési tervben egy munkatábla használatával implementálja a kivonat-illesztést, a nyomtatási sort vagy azt a rendezési táblázatot, amely tartalmazza a kifejezést. Emellett a munkatábla megfelelő oszlopa nem nullázhatóként van deklarálva. Amikor az SQL Server lekérdezésmotorja null értékeket próbál beszúrni a munkatáblába, a hiba történik.

Megoldás

A hiba javítását először az SQL Server 2008 Service Pack 1 7. összegző frissítésében adták ki. Az összegző frissítési csomagról a Microsoft Tudásbázis alábbi cikkében tájékozódhat:

979065 7-es összegző frissítőcsomag a 2008. SQL Server Service Pack 1-hez Megjegyzés: Mivel a buildek kumulatívak, minden új javításkiadás tartalmazza az előző, SQL Server 2008-as javítás előző kiadásában szereplő összes gyorsjavítást és biztonsági javítást. Javasoljuk, hogy fontolja meg a gyorsjavítást tartalmazó legújabb javítás telepítését. További információ a Microsoft Tudásbázis következő számú cikkében olvasható (a cikk megnyitásához kattintson a sorszámra):

970365 A SQL Server 2008-as szervizcsomag 1 után megjelent SQL Server 2008-as buildek
A Microsoft SQL Server 2008 gyorsjavításai meghatározott SQL Server szervizcsomagokhoz jönnek létre. Az SQL Server 2008 Service Pack 1 telepítéséhez telepítenie kell az SQL Server 2008 Service Pack 1 gyorsjavítását. Alapértelmezés szerint az SQL Server szervizcsomagjában található összes gyorsjavítás megtalálható a következő SQL Server szervizcsomagban.

Kerülő megoldás

A problémát az alábbi módszerek egyikével kerülheti meg.

1. módszer:

Távolítsa el az ISNULL() függvényt a lekérdezésből.

Megjegyzés: Mivel a függvényben található oszlop a JOIN operátorból származik, amely elutasítja a NULL értékeket, az ISNULL() függvény redundáns.

2. módszer:

Írja át a lekérdezést úgy, hogy a lekérdezési terv ne használjon kivonatillesztést, várólistát vagy rendezési táblát. Ha például a lekérdezés tartalmaz ORDER BY záradékot, hozzon létre egy csoportosított vagy lefedő indexet, amely biztosítja a szükséges rendezést és az összes szükséges oszlopot tartalmazza. E módszer használatakor a Query Optimizer nem használ rendezési táblázatot.

Állapot

A Microsoft megerősítette, hogy ez egy olyan probléma a Microsoft-termékekben, amely az „Érintett szolgáltatás“ című szakaszban van felsorolva.

Hivatkozások

Az SQL Server növekményes karbantartási modelljéről a Microsoft Tudásbázis alábbi cikkében tájékozódhat:

935897 A SQL Server csapatától elérhető egy növekményes karbantartási modell a jelentett problémák gyorsjavításához

Az SQL Server frissítéseihez szükséges elnevezési sémáról a Microsoft Tudásbázis alábbi cikkében tájékozódhat:

822499 Új elnevezési séma a Microsoft SQL Server szoftverfrissítési csomagjaihoz

A szoftverfrissítésekkel kapcsolatos terminológiáról a Microsoft Tudásbázis alábbi cikkében tájékozódhat:

824684 A Microsoft szoftverfrissítéseinek leírására használt szabványos terminológia leírása