Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Para expertos en T-SQL de SQL Server 2k

Estas en el tema de Para expertos en T-SQL de SQL Server 2k en el foro de Bases de Datos General en Foros del Web. A ver como empiezo La cosa es esta: tengo que crear una stored procedure que me pase datos de un archivo Excel a una base ...
  #1 (permalink)  
Antiguo 01/09/2004, 04:13
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Pregunta Para expertos en T-SQL de SQL Server 2k

A ver como empiezo

La cosa es esta: tengo que crear una stored procedure que me pase datos de un archivo Excel a una base de datos SQL. Los datos deben pasarse a la tabla temp_produits que es creada desde cero cada vez. Todo eso esta hecho con un BULK INSERT siempre y cuando defina la tabla temp_produits con cada una de sus columnas. El problema es que el numero de estas columnas es variable en el archivo Excel.
Asi que basicamente la pregunta seria si hay alguna forma de copiar la estructura de columnas de un archivo Excel a una tabla de una base de datos SQL? Y una vez hecho esto, puedo definir las propiedades de cada columna de dicha tabla?
Mil gracias por la ayuda de antemano
__________________
LADRONES
  #2 (permalink)  
Antiguo 01/09/2004, 07:38
 
Fecha de Ingreso: agosto-2003
Mensajes: 448
Antigüedad: 20 años, 8 meses
Puntos: 1
Queres hacerlo sólo con T-SQL?, creo que sería mas facil hacerlo con Visual Basic, Delphi, C# u otro lenguaje de programación
  #3 (permalink)  
Antiguo 01/09/2004, 08:35
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Me gustan los retos
Esto es lo que he hecho hasta ahora despues de mucho investigar
Código:
USE pc21
GO
DROP table produits_temp
SELECT     ref_constr, titre_prod, disp_prod, ht_prix_public_e, ht_prod_e, taux_marge
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 <> 'NULL'
SELECT @@ROWCOUNT
ALTER TABLE produits_temp ALTER COLUMN ref_constr nvarchar(30) not null
ALTER TABLE produits_temp ALTER COLUMN titre_prod nvarchar(128) null
ALTER TABLE produits_temp ALTER COLUMN disp_prod nvarchar(50) null
ALTER TABLE produits_temp ALTER COLUMN ht_prix_public_e money null
ALTER TABLE produits_temp ALTER COLUMN ht_prod_e money null
ALTER TABLE produits_temp ALTER COLUMN taux_marge float(8) null
GO
pero como podeis ver tengo que seleccionar a la mano los campos que quiero, si hago un SELECT * me mete campos de mas (F1 a F255) no se xq hace esto. Ayuda!!!!!!
__________________
LADRONES
  #4 (permalink)  
Antiguo 01/09/2004, 08:55
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Vale creo que mas o menos me las podria apañar si algun alma candida me dice como demonios compruebo (siempre desde T-SQL x supuesto) si una tabla tiene una columna determinada. Es decir un IF (existe_columna_x_en_tabla_x) haz esto.
__________________
LADRONES
  #5 (permalink)  
Antiguo 01/09/2004, 14:39
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Dale una checada a:
Código:
SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'produits_temp'
De cualquier forma yo huera hecho esa importacion a través de un DTS del SQL Server... de hecho, es lo que hago (fuentes Oracle, Access y TXT, pero hay muchas mas, Excel incluído)
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #6 (permalink)  
Antiguo 02/09/2004, 04:13
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Vale MithRandir tu respuesta me ha funcionado bien, no utilizo DTS porque estoy haciendo una aplicacion para que la use mi jefe, es decir, a prueba de idiotas, y que no importa que columnas tengas en la tabla Excel siempre te funcione, y esto con DTS no se puede hacer porque si guardas el procedimiento en lotes locales te busca siempre las mismas tablas y me puede dar error.
Esto es lo que he hecho hasta ahora
Código:
USE pc21
GO

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 <> 'NULL'

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ref_constr'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ref_constr'
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
PRINT 'titre_prod'
ALTER TABLE produits_temp ALTER COLUMN titre_prod nvarchar(128) null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'disp_prod'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'disp_prod'
ALTER TABLE produits_temp ALTER COLUMN disp_prod nvarchar(50) null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prix_public_e'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ht_prix_public_e'
ALTER TABLE produits_temp ALTER COLUMN ht_prix_public_e money null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prod_e'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ht_prod_e'
ALTER TABLE produits_temp ALTER COLUMN ht_prod_e money null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prod_f'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ht_prod_f'
ALTER TABLE produits_temp ALTER COLUMN ht_prod_f money null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ttc_prod_e'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ttc_prod_e'
ALTER TABLE produits_temp ALTER COLUMN ttc_prod_e money null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ttc_prod_f'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ttc_prod_f'
ALTER TABLE produits_temp ALTER COLUMN ttc_prod_f money null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'taux_marge'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'taux_marge'
ALTER TABLE produits_temp ALTER COLUMN taux_marge float(8) null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'id_ss_cat'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'id_ss_cat'
ALTER TABLE produits_temp ALTER COLUMN id_ss_cat int null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'id_mark'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'id_mark'
ALTER TABLE produits_temp ALTER COLUMN id_mark int null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ref_pc21'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ref_pc21'
ALTER TABLE produits_temp ALTER COLUMN ref_pc21 nvarchar(50) null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'descrip_prod'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'descrip_prod'
ALTER TABLE produits_temp ALTER COLUMN descrip_prod ntext null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'caract_prod'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'caract_prod'
ALTER TABLE produits_temp ALTER COLUMN caract_prod ntext null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'img_prod'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'img_prod'
ALTER TABLE produits_temp ALTER COLUMN img_prod nvarchar(50) null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'affichage'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'affichage'
ALTER TABLE produits_temp ALTER COLUMN affichage bit null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'promo'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'promo'
ALTER TABLE produits_temp ALTER COLUMN promo bit null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'promo_gen'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'promo_gen'
ALTER TABLE produits_temp ALTER COLUMN promo_gen bit null
END
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prix_achat_e'
if (@@ROWCOUNT>=1)
BEGIN
PRINT 'ht_prix_achat_e efface'
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
PRINT 'titre_fournisseur efface'
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
PRINT 'remise_frn efface'
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
PRINT 'id_prod efface'
ALTER TABLE produits_temp DROP COLUMN id_prod
END
GO
Ademas a partir de que tengo la tabla creada lo que kiero hacer es actualizar otra tabla.
Os explico, esta tabla que he creado se llama temp_produits, contiene detalles de productos que luego vendemos. Todos estos productos van a ir en la tabla produit_backup solo que algunos ya existen y otros son nuevos. Los existentes deberan actualizarse con los datos en temp_produits, solo las columnas que esta tabla contenga, siempre que la ref_constr (referencia constructor que uso como indice) sea igual. Aquellos que no existan en la tabla produit_backup (su ref_constr no esta en esa tabla) deberan ser añadidos.
Consigo hacer esto

Código:
SELECT produits_temp.* FROM produits_temp LEFT OUTER JOIN produit_backup ON produits_temp.ref_constr=produit_backup.ref_constr
WHERE produit_backup.ref_constr <> 'NULL'

SELECT produits_temp.*, produit_backup.ref_constr FROM produits_temp LEFT OUTER JOIN produit_backup ON produits_temp.ref_constr=produit_backup.ref_constr
WHERE produit_backup.ref_constr = 'NULL'
El primer SELECT me saca todos los productos a actualizar pero como los actualizo todos en masa????
El segundo SELECT no me saca ningun registro cuando normalmente deberia haber 17 registros y no se porque. Ayuda por favor.
__________________
LADRONES
  #7 (permalink)  
Antiguo 02/09/2004, 04:30
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 1 mes
Puntos: 0
Y por qué no le hace una macro de excel, en visual, a tu jefe y que la ejecute desde el mismo excel, desde ahí tíenes más control de la hoja, y grabar datos en SQL es igual de sencillo
  #8 (permalink)  
Antiguo 02/09/2004, 04:40
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Pues por varias razones
1. Porque el trabajo seria bastante pesado y quiero que se ejecute durante la noche.
2. Porque haria trabajar menos al servidor.
3. Porque tengo esto a medias y con lo que me ha costado hacerlo quiero acabarlo.
4. Porque apenas me acuerdo de como iba lo de la creacion de macros.
5. Porque quiero que sea lo mas transparente posible para mi jefe.
6. Porque si se le jode la maquina donde esta metida la macro lo perdemos todo, mientras que de la BBDD hay copias de seguridad diarias.
7. Porque me da rabia no saber hacer lo que me propongo :-p :-p :-p
__________________
LADRONES
  #9 (permalink)  
Antiguo 02/09/2004, 05:46
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años, 1 mes
Puntos: 0
Oído cocina....

Siguiendo por donde ibas...

La segunda select on te sale, porque debes cambiar el WHERE, donde pones produit_backup.ref_constr = 'NULL' debería poner produit_backup.ref_constr Is NULL

Para la primera, es un poco más complicado, compruebo las select de actualizaciónen SQL, y te digo

Un saludo
  #10 (permalink)  
Antiguo 02/09/2004, 14:40
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
INSERT funciona para las inserciones en masa:
Código:
INSERT INTO produit_backup
SELECT produits_temp.* --ESTO ES NULL NO?, no sirve: , produit_backup.ref_constr 
FROM produits_temp 
	LEFT OUTER JOIN produit_backup 
		ON produits_temp.ref_constr=produit_backup.ref_constr
WHERE produit_backup.ref_constr = 'NULL'

/*Este es usando subquierys, menos eficientes pero mas legibles*/
INSERT INTO produit_backup
SELECT * FROM produits_temp
WHERE ref_constr NOT IN (SELECT ref_constr FROM produits_temp)
Las desventajas de estos metodos es que no controlas las modificaciones en campos ya existentes, si sabes que no hay modificaciones pues adelante.

Por ultimo, funciona igual, pero creo que es mas legible que en lugar de uno uses el otro:
Código:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prix_achat_e'
if (@@ROWCOUNT>=1)
BEGIN
...

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'produits_temp' AND column_name = 'ht_prix_achat_e')
BEGIN
...
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche

Última edición por Mithrandir; 02/09/2004 a las 14:41
  #11 (permalink)  
Antiguo 13/09/2004, 07:08
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 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
__________________
LADRONES
  #12 (permalink)  
Antiguo 13/09/2004, 15:50
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Código:
UPDATE tabla1 
SET tabla1.campo1 = tabla2.campo1,... 
FROM tabla1 
	INNER JOIN tabla2
		ON tabla1.llave = tabla2.llave
Espero sirva
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #13 (permalink)  
Antiguo 14/09/2004, 03:05
Avatar de Txukie  
Fecha de Ingreso: junio-2004
Ubicación: Al Oeste del Nervion
Mensajes: 47
Antigüedad: 19 años, 10 meses
Puntos: 0
Si! Funciona! Gracias una vez mas Mithrandir, no se que haria yo sin ti
De todas formas una ultima pregunta, ya que el tema del Transact SQL (para SQL Server no para Sybase) me interesa mucho me recomendais algun buen libro o si teneis algun buen manual en pdf podeis enviarmelo por correo (privado y os doy mi direccion de correo privada). Un saludo y mil gracias. Aqui os dejo el codigo definitivo. Usarlo cuanto querais
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 @requete_update='UPDATE produit SET '
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),'
SET @requete_update=@requete_update+'produit.titre_prod=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),'
SET @requete_update=@requete_update+'produit.disp_prod=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),'
SET @requete_update=@requete_update+'produit.ht_prix_public_e=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),'
SET @requete_update=@requete_update+'produit.ht_prod_e=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),'
SET @requete_update=@requete_update+'produit.taux_marge=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),'
SET @requete_update=@requete_update+'produit.id_ss_cat=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),'
SET @requete_update=@requete_update+'produit.id_mark=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),'
SET @requete_update=@requete_update+'produit.ref_pc21=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),'
SET @requete_update=@requete_update+'produit.descrip_prod=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),'
SET @requete_update=@requete_update+'produit.caract_prod=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),'
SET @requete_update=@requete_update+'produit.img_prod=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),'
SET @requete_update=@requete_update+'produit.affichage=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),'
SET @requete_update=@requete_update+'produit.promo=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),'
SET @requete_update=@requete_update+'produit.promo_gen=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'
SET @requete_update=@requete_update+'produit.ref_constr=produit.ref_constr FROM produit INNER JOIN produits_temp ON produit.ref_constr=produits_temp.ref_constr WHERE produit.ref_constr=produits_temp.ref_constr'
EXEC (@requete_insert)
EXEC (@requete_update)
GO
EDITO: Si alguien no entiende algo del codigo que me pida ayuda que para eso estamos
__________________
LADRONES

Última edición por Txukie; 14/09/2004 a las 03:07
  #14 (permalink)  
Antiguo 14/09/2004, 14:48
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Pues la verdad es que no conozco ningun libro mejor que los Books Online integrados con el SQL Server (en realidad no he leido ningun otro aparte de este y el del MOC de MS).

Si tienes alguna duda con el TSQL que ahi no venga pues la red te puede ayudar.

Uno de mis sitios frecuentes es www.sqlservercentral.com
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:27.