Pracuję nad zapytaniem, które kopiuje strukturę tabeli z połączonego serwera do lokalnej bazy danych dla ogólnej listy tabel.Zmiany typu danych w nowej tabeli podczas korzystania z SELECT * INTO
Jednak z jakiegoś powodu dziesiętne typy danych zmieniają się na liczbowe. Wydaje się, że zdarza się to tylko przy wybieraniu serwerów połączonych. Jednak przy próbie tego samego w moim lokalnym systemie nie mogłem replikować problemu.
Środowisko, w którym wystąpił ten błąd, wersja SQL serwera lokalnego i połączonego były inne (odpowiednio 10, 12). Nie wiem, czy to jest powiązane.
Jeśli ktokolwiek mógłby rzucić trochę światła na to, byłoby to bardzo cenne. Dzięki.
Zapytanie jest za poniżej
WHILE (select count(*) from @tbls) > 0
BEGIN
SELECT @id = 0, @tblname = '', @cols = '', @colSets = ''
select top 1 @id = ID, @tblname = TableName, @PKField = PKField, @DataType = DataType from @tbls
if exists (select 1 from sys.tables where name = @tblname)
begin
delete from @tbls where ID = @id
Continue;
end
exec('select * into '+ @tblname +' from [linkedserver].MyDatabase.dbo.'[email protected] + ' where 1 = 0')
delete from @tbls where ID = @id
END
W serwerze SqlServer wie, że zestawy znaków i formaty są takie same. Więc zachowuje źródło. Między różnymi serwerami zwykle domyślnie rzutuje wszystkie typy danych na najwyższy wspólny mianownik dla każdego typu danych. Ponieważ próbujesz utworzyć tabelę bez danych, zobacz ten wątek: http://stackoverflow.com/questions/21547/in-sql-server-how-do-i-generate-a-create-table-statement- for-a-given-table –
Sezonowy duplikat http://stackoverflow.com/questions/33513776/sql-auto-converts-decimal-to-numeric-when-select-insert –
@AndreeaDumitru To może być duplikat, ale jedna odpowiedź na nie nie odpowiada. Żadna z tych odpowiedzi nie została zaakceptowana ... –