Nie, nigdzie nie jest zalogowany. Głosuj i podaj swoje uzasadnienie biznesowe; jest to jedna z długiej listy rzeczy, które powinny zostać naprawione w SQL Server.
To było wymagane wiele lat temu w Connect (prawdopodobnie najpierw w ramach czasowych SQL Server 2000 lub 2005), a następnie w nowym systemie informacji zwrotnej:
A teraz został dostarczony w SQL Server 2019 , SQL Server 2017 CU12, i pojawi się w przyszłym SQL Server 2016 SP2 CU.
W pierwszym publicznym CTP programu SQL Server 2019 pojawia się tylko pod flagą śledzenia 460. Brzmi to trochę sekretnie, ale zostało opublikowane w białej księdze Microsoft . Będzie to zachowanie domyślne (nie wymaga flagi śledzenia), ale będziesz mógł to kontrolować za pomocą nowej konfiguracji o zasięgu baz danych VERBOSE_TRUNCATION_WARNINGS
.
Oto przykład:
USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));
INSERT dbo.x(a) VALUES('foo');
GO
Wynik we wszystkich obsługiwanych wersjach wcześniejszych niż SQL Server 2019:
Msg 8152, poziom 16, stan 30, wiersz 5
Ciąg lub dane binarne zostałyby obcięte.
Instrukcja została zakończona.
Teraz na serwerach CTP programu SQL Server 2019 z włączoną flagą śledzenia:
DBCC TRACEON(460);
GO
INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);
Wynik pokazuje tabelę, kolumnę i wartość ( obciętą , niepełną ):
Msg 2628, poziom 16, stan 1, wiersz 11 Dane
łańcuchowe lub binarne zostałyby obcięte w tabeli „tempdb.dbo.x”, kolumna „a”. Skrócona wartość: „f”.
Instrukcja została zakończona.
Dopóki nie możesz porzucić wszystkiego i uaktualnić do SQL Server 2019 lub przejść do bazy danych SQL Azure, możesz zmienić kod „automagiczny”, aby faktycznie pobierał maksymalną długość sys.columns
, wraz z nazwą, którą i tak musisz tam dostać, a następnie zastosować LEFT(column, max_length)
lub niezależnie od ekwiwalentu PG. Lub, ponieważ oznacza to po prostu, że po cichu stracisz dane, dowiedz się, które kolumny są niedopasowane i napraw kolumny docelowe, aby pasowały do wszystkich danych ze źródła. Biorąc pod uwagę dostęp do metadanych do obu systemów oraz fakt, że już piszesz zapytanie, które musi automatycznie dopasowywać źródło -> kolumny docelowe (w przeciwnym razie ten błąd nie byłby twoim największym problemem), nie powinieneś robić żadnej brutalnej siły zgadywanie w ogóle.
sys.columns
ponieważ absolutnie nie miałem pojęcia, jakiego kodu używasz obecnie do „automatycznego” generowania zapytań. Naprawdę nie ma o wiele bardziej złożonego, o czym mógłbym się domyślić w kwestii włączenia do twojego kodu niżSELECT name, object_id, max_length FROM sys.columns;
. Ponieważ masz już kod automagiczny, który musi to robić - lub coś bardzo podobnego - nie sądziłem, że przykład jest potrzebny.