Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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?

Předmět Autor Datum
Nezkusel jsi misto "Select * from OpenQuery" dat Select Col1, Col2 from OpenQuery? Nezkousel jsi kla…
Jan Fiala 23.06.2008 17:41
Jan Fiala
Zkusil jsem nahradit hvězdičku s COL1, COL2, nepomohlo, stejně jako DEFAULT VALUES kdekoliv pod prvn…
Vladimir 23.06.2008 19:07
Vladimir
5000 radku zase neni tak moc. -- tady si uprav datove typy DECLARE @COL1 varchar(20), @Col2 varchar…
Jan Fiala 23.06.2008 19:19
Jan Fiala
tak teď jsem z toho blbej. Pokud jsem to pustil takhle, tak to házelo úplně stejnou chybu, přidal js…
Vladimir 23.06.2008 20:13
Vladimir
Vic ti asi neporadim, protoze zkusenosti s linkovanim Oracle na MS SQL nemam. Ten cursor ti jen umoz…
Jan Fiala 23.06.2008 20:30
Jan Fiala
To linkování funguje nějak divně. insert into ORACLE..SCHEMA.TABULE(COL1,COL2,COL3,COL4) values ('H…
Vladimir 23.06.2008 20:44
Vladimir
Prubni provider ORAOLEDB.ORACLE - sám ho používám a nemám celkem problém. (Kdysi jsem začínal na MSD…
mrazek 24.06.2008 15:41
mrazek
vyřešeno, s ORAOLEODB.ORACLE ten insert běží - díky. Kdyby někomu ten Oraoledb.oracle nefungoval, m… poslední
Vladimir 25.06.2008 17:10
Vladimir
Nebude jednoduchšie explicitne uviesť predvolené hodnoty priamo vo výberovom príkaze? Aké sú dátové…
los 23.06.2008 21:02
los
Ta pole jsou ve skutečnosti čtyři. Jsou to buď pole buď s datumem kam se vkládá sysdate insertování…
Vladimir 23.06.2008 23:10
Vladimir

Nezkusel jsi misto "Select * from OpenQuery" dat
Select Col1, Col2 from OpenQuery?
Nezkousel jsi klauzuli DEFAULT VALUES v tom insertu?

insert into ORACLE..SCHEMA.TABULE(COL1,COL2) 
SELECT COL1, COL2 FROM OPENQUERY
(SQL2, 'select COL1, COL2 from bflmpsvz')
DEFAULT VALUES

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

insert into ORACLE..SCHEMA.TABULE(COL1,COL2)
DEFAULT VALUES 
SELECT COL1, COL2 FROM OPENQUERY
(SQL2, 'select COL1, COL2 from bflmpsvz')

což ale nefunguje proto, že to zkouší dát default values všude :/

Dalsi moznost (pokud tech dat neni moc) je to prohnat pres cursor a v cyklu to vkladat vetu po vete.

Dat je asi 5000 řádků - popostrčil bys mne jak?

5000 radku zase neni tak moc.

-- tady si uprav datove typy
DECLARE @COL1 varchar(20), @Col2 varchar(20)  

DECLARE cursTabule CURSOR FOR      
SELECT COL1, COL2 FROM OPENQUERY
(SQL2, 'select COL1, COL2 from bflmpsvz')

OPEN cursTabule          
FETCH NEXT FROM cursTabule
	INTO @Col1, @Col2
WHILE @@FETCH_STATUS = 0
BEGIN
	-- vlastni inserty 
	insert into ORACLE..SCHEMA.TABULE(COL1,COL2)
		values (@Col1, @Col2)
	FETCH NEXT FROM cursTabule
	INTO @Col1, @Col2
END

CLOSE cursTabule
DEALLOCATE cursTabule

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:

DECLARE @COL1 varchar(20), @Col2 varchar(20)

DECLARE cursTabule CURSOR FOR
SELECT COL1, COL2 FROM OPENQUERY
(SQL2, 'select COL1, COL2 from bflmpsvz')

OPEN cursTabule
FETCH NEXT FROM cursTabule
INTO @Col1, @Col2
WHILE @@FETCH_STATUS = 0
BEGIN
-- vlastni inserty
insert into ORACLE..SCHEMA.TABULE(COL1,COL2,COL3,COL4)
values (@Col1, @Col2, DEFAULT, DEFAULT)
FETCH NEXT FROM cursTabule
INTO @Col1, @Col2
END

CLOSE cursTabule
DEALLOCATE cursTabule

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ě.

insert into ORACLE..SCHEMA.TABULE(COL1,COL2,COL3,COL4)
values ('HODNOTA', 'HODNOTA', DEFAULT, DEFAULT)

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 :)

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:

EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1

, 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.

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.

Zpět do poradny Odpovědět na původní otázku Nahoru