13/09/2004, 07:08
|
| | | Fecha de Ingreso: junio-2004 Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 20 años, 7 meses Puntos: 0 | |
Siento tardar tanto en responder
He trabajado bastante sobre esto. Decirte Mithrandir que tu opcion no era del todo buena porque todos los campos de la tabla origen no tenian porque (y casi nunca) coincidir. Asi que he hecho esto que sigue:
Código:
USE pc21
GO
DECLARE @requete_update nvarchar(500)
DECLARE @requete_insert nvarchar(500)
DECLARE @converts_insert nvarchar(1000)
DROP table produits_temp
SELECT *
INTO produits_temp
FROM OPENDATASOURCE ('Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\produits.xls";User ID=Admin;Password=;Extended properties=Excel 5.0' )...produits$
WHERE ref_constr IS NOT NULL
SET @requete_insert='INSERT INTO produit ('
SET @converts_insert=''
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ref_constr'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN ref_constr nvarchar(30) not null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'titre_prod'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN titre_prod nvarchar(128) null
SET @requete_insert=@requete_insert+'titre_prod,'
SET @converts_insert=@converts_insert+'CONVERT(nvarchar(128),produits_temp.titre_prod),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'disp_prod'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN disp_prod nvarchar(50) null
SET @requete_insert=@requete_insert+'disp_prod,'
SET @converts_insert=@converts_insert+'CONVERT(nvarchar(50),produits_temp.disp_prod),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prix_public_e'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN ht_prix_public_e money null
SET @requete_insert=@requete_insert+'ht_prix_public_e,'
SET @converts_insert=@converts_insert+'CONVERT(money,produits_temp.ht_prix_public_e),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prod_e'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN ht_prod_e money null
SET @requete_insert=@requete_insert+'ht_prod_e,'
SET @converts_insert=@converts_insert+'CONVERT(money,produits_temp.ht_prod_e),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prod_f'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN ht_prod_f
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ttc_prod_e'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN ttc_prod_e
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ttc_prod_f'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN ttc_prod_f
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'taux_marge'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN taux_marge float(8) null
SET @requete_insert=@requete_insert+'taux_marge,'
SET @converts_insert=@converts_insert+'CONVERT(float(8),produits_temp.taux_marge),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'id_ss_cat'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN id_ss_cat int null
SET @requete_insert=@requete_insert+'id_ss_cat,'
SET @converts_insert=@converts_insert+'CONVERT(int,produits_temp.id_ss_cat),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'id_mark'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN id_mark int null
SET @requete_insert=@requete_insert+'id_mark,'
SET @converts_insert=@converts_insert+'CONVERT(int,produits_temp.id_mark),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ref_pc21'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN ref_pc21 nvarchar(50) null
SET @requete_insert=@requete_insert+'ref_pc21,'
SET @converts_insert=@converts_insert+'CONVERT(nvarchar(50),produits_temp.ref_pc21),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'descrip_prod'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN descrip_prod ntext null
SET @requete_insert=@requete_insert+'descrip_prod,'
SET @converts_insert=@converts_insert+'CONVERT(ntext,produits_temp.descrip_prod),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'caract_prod'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN caract_prod ntext null
SET @requete_insert=@requete_insert+'caract_prod,'
SET @converts_insert=@converts_insert+'CONVERT(ntext,produits_temp.caract_prod),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'img_prod'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN img_prod nvarchar(50) null
SET @requete_insert=@requete_insert+'img_prod,'
SET @converts_insert=@converts_insert+'CONVERT(nvarchar(50),produits_temp.img_prod),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'affichage'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN affichage bit null
SET @requete_insert=@requete_insert+'affichage,'
SET @converts_insert=@converts_insert+'CONVERT(bit,produits_temp.affichage),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'promo'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN promo bit null
SET @requete_insert=@requete_insert+'promo,'
SET @converts_insert=@converts_insert+'CONVERT(bit,produits_temp.promo),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'promo_gen'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp ALTER COLUMN promo_gen bit null
SET @requete_insert=@requete_insert+'promo_gen,'
SET @converts_insert=@converts_insert+'CONVERT(bit),produits_temp.promo_gen),'
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prix_achat_e'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN ht_prix_achat_e
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'titre_fournisseur'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN titre_fournisseur
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'remise_frn'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN remise_frn
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'id_prod'
if (@@ROWCOUNT>=1)
BEGIN
ALTER TABLE produits_temp DROP COLUMN id_prod
END
SET @converts_insert=@converts_insert+'CONVERT(nvarchar(30),produits_temp.ref_constr)'
SET @requete_insert=@requete_insert+'ref_constr) SELECT '
SET @requete_insert=@requete_insert+@converts_insert
SET @requete_insert=@requete_insert+' FROM produits_temp LEFT OUTER JOIN produit ON produits_temp.ref_constr = produit.ref_constr WHERE produit.ref_constr is NULL'
EXEC (@requete_insert)
SELECT produits_temp.* FROM produits_temp LEFT OUTER JOIN produit ON produits_temp.ref_constr=produit.ref_constr
WHERE produit.ref_constr IS NOT NULL
SELECT produits_temp.* FROM produits_temp LEFT OUTER JOIN produit ON produits_temp.ref_constr=produit.ref_constr
WHERE produit.ref_constr IS NULL
GO
Lo que esto hace es construirme una variable @requete_insert que es la cadena de caracteres de la consulta sql de insercion de nuevos registros. Luego la ejecuto con EXEC(@requete_insert).
Esto lo he probado y funciona bien, y podeis usarlo en vuestros proyectos cuanto querais (si me invitais a unas cañas claro ).
El problema ahora es que no consigo hacer lo mismo para la puesta al dia de productos viejos cuyos registros son modificados en la tabla excel. Hay algo parecido a
Código:
INSERT INTO tabla (campo1,....) SELECT campoa FROM tabla2 WHERE condicion
pero con UPDATE????
Por favor ayuda, se me dan fatal las subconsultas |