Natrafiłem niedawno na problem w skrypcie SQL, gdzie instrukcja insert (wstawiająca wiele wierszy) miała kolumnę typu varchar (10), a wiersze danych, które wstawiał, przekazywały w int.SQL po cichu konwertuje int na varchar, ale następnie generuje błąd, gdy napotka varchar?
Jednak, kiedy dodaje się nowy wiersz danych do wstawiania i stosowane varchar w kolumnie varchar SQL próbowali przekształcić int, mimo że kolumna typu VarChar (10)
Oto przykład, który możesz uruchomić lokalnie.
CREATE TABLE dbo.TestTable
(
VarcharColumn varchar(10) NOT NULL
) ON [PRIMARY]
insert into TestTable(VarcharColumn)
Values (1)
Po uruchomieniu tego wstawia dobrze, SQL musi cicho przekonwertować wartość całkowitą na varchar za kulisami.
Jednak wtedy, jeśli spróbujesz to:
insert into TestTable(VarcharColumn)
Values (1),(2),('Hello')
SQL rzuci się następujący błąd:
Conversion failed when converting the varchar value 'Hello' to data type int.
Czy ktoś może zaoferować wyjaśnienie do wewnętrznych mechanizmów SQL w tym przypadku? Konkretnie:
- Dlaczego SQL pozwala na wstawianie liczb całkowitych w kolumnach varchar
- Dlaczego gdy SQL jest cicho konwersji tych wartości, jeśli przebiega rzeczywistej varchar będzie starał się przekształcić go na int.
Rozumiem, jak rozwiązać ten problem i jak go uniknąć, ale szukam wyjaśnienia, dlaczego SQL działa w ten sposób.
przejść przez [dokumentacja] (https://msdn.microsoft.com/en-us/library/ms191530.aspx) –
Co jest wyjaśniać? Twoje pytania pokazują, że dokładnie rozumiesz, jaka jest sytuacja. Odpowiedź brzmi: Tak działa SQL Server. –
@GordonLinoff, to nie jest to, o co prosiłem. Zadałem dwa pytania: jedno, dlaczego zezwala na niejawną konwersję (która wydaje się wyjaśniać odsyłacz vkp do dokumentacji) i jak niejawna konwersja działa w instrukcjach wstawiania z wieloma wierszami. "Tak po prostu działa" to okropne, nic nie mówi. –