

INSERT INTO tabule SELECT do DEFAULT values [ORACLE, MSSQL, linked servers]
Přátelé mám následující problém. Pouštím tenhle dotaz na MSSQL2005 ("SQL1") s vytvořeným linked serverem na Oracle10. ("ORACLE") a linked serverem na jiný MSSQL2005 ("SQL2"). Pro problém není zas tak podstatný způsob pouštění selektu jako vkládání do sloupců s default values.
Snažím se vložit něco do tabule která má sloupce s default values (col3, col4 - jsou tam zakomentované bo do nich nemám co vložit), takže je logické že to nebude fungovat:
insert into ORACLE..SCHEMA.TABULE(COL1,COL2
/*COL3, COL4*/
)
SELECT * FROM OPENQUERY
(SQL2,
'select COL1, COL2 from bflmpsvz'
)
Celé to spadne na
Msg 7344, Level 16, State 1, Line 1
The OLE DB provider "MSDAORA" for linked server "ORACLE" could not INSERT INTO table "[ORACLE]..[SCHEMA].[TABULE]" because of column "COL3". The column used the default value.
Kdybych vkládal do toho oraclu VALUES, tak bych tam zkusil procpat DEFAULT, ale tady vkládám ze selektu takže nevím co dál
Nejde třeba nějak zkombinovat INSERT INTO tabule SELECT a INSERT INTO tabule VALUES dohromady?
Nezkusel jsi misto "Select * from OpenQuery" dat
Select Col1, Col2 from OpenQuery?
Nezkousel jsi klauzuli DEFAULT VALUES v tom insertu?
Dalsi moznost (pokud tech dat neni moc) je to prohnat pres cursor a v cyklu to vkladat vetu po vete.
Zkusil jsem nahradit hvězdičku s COL1, COL2, nepomohlo, stejně jako DEFAULT VALUES kdekoliv pod prvním SELECT v tvé syntaxi.
Bere to jen
což ale nefunguje proto, že to zkouší dát default values všude :/
Dat je asi 5000 řádků - popostrčil bys mne jak?
5000 radku zase neni tak moc.
tak teď jsem z toho blbej. Pokud jsem to pustil takhle, tak to házelo úplně stejnou chybu, přidal jsem proto DEFAULTy do VALUES co se v tom cyklu vkládají a hlásí to pořád to samé :/
Udělal jsem toto:
Vic ti asi neporadim, protoze zkusenosti s linkovanim Oracle na MS SQL nemam.
Ten cursor ti jen umozni si v tom insertu udelat co potrebujes.
Podari se ti aspon (nejakym zpusobem) rucne spusteny insert?
Nevim, zda by pomohlo nejake mapovani tabulek, kde bys namapoval i pole, ale MS SQL vs Oracle fakt nemam zkusenosti.
To linkování funguje nějak divně.
mi přes linked server vyhodí chybu (stejnou jako v záhlaví), spuštěno lokálně na oracle v pořádku vloží řádek.
Jdu z práce, uvidíme zítra .-) Zkusim se podívat jestli neexistuje jiný provider než MSDAORA.
PS. díky za ten kod bude se hodit :)
Prubni provider ORAOLEDB.ORACLE - sám ho používám a nemám celkem problém. (Kdysi jsem začínal na MSDAORA a měl jsem s ním i jiné problémy, než píšeš...)
vyřešeno, s ORAOLEODB.ORACLE ten insert běží - díky.
Kdyby někomu ten Oraoledb.oracle nefungoval, může to být i tím, že není AllowInProcess vlastnost provideru nastavená na 1. Mě to pomohlo.
To se dá řešit:
, nebo se dá nastavit v registru. (Já to ale v tom bordelu nenašel, na tom stroji je současně SQL2000 i 2005).
Pozor, snižuje to výkon - provider běží v procesu serveru.
Nebude jednoduchšie explicitne uviesť predvolené hodnoty priamo vo výberovom príkaze?
Aké sú dátové typy polí COL3 a COL4 a aké sú predvolené hodnoty?
Ta pole jsou ve skutečnosti čtyři. Jsou to buď pole buď s datumem kam se vkládá sysdate insertování nebo updadování, nebo, a to je složitější, varchary kde se vkládá aktuální oracle user...
Vymyslet si ty hodnoty v selektu není zrovna řešení které jsem chtěl - čas může být na MSSQL jiný (i když to je spíš teoretický detail, to by nevadilo) a toho uživatele mi nenapadá jak tam dostat.