1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
CREATE PROCEDURE [dbo].[ps_I_importdata]
@nom_table CHAR (255),
@champs char (255),
@data CHAR (255)
as
declare @data2 as CHAR (255)
declare @compteur as int
declare @longueur int
declare @position int
declare @cle varchar(255)
declare @expression char(255)
declare @parametre varchar(1000)
declare @query varchar(1000)
DECLARE @i INT, @sql NVARCHAR(1000)
declare @champ varchar(250)
begin
set @compteur=0
set @data2=@data
declare curseur1 CURSOR for SELECT column_name as champ FROM INFORMATION_SCHEMA.columns WHERE table_name =@nom_table AND IS_NULLABLE='NO'--Curseur parcourant les clés de la table spécifiée
open curseur1
fetch curseur1 into @cle
while @@FETCH_STATUS=0
begin
set @longueur=len(@data2)--Récupération de la longueur de la chaine de caracteres a insérer dans la base de données
set @position=PATINDEX('%,%',@data2)--Récupération de la position de la premiere virgule(séparateur de champs) dans la chaine
set @expression=substring(@data2,0,@position)--Cette variable prend successivement les valeurs des clés de la table
set @data2=substring(@data2,@position +1,@longueur - @position)--On enleve de la chaine de caracteres le champ qui vient d'etre inséré dans la chaine d'insertion
if @compteur=0 begin select @parametre = 'Where '+rtrim(@cle) +'="'+rtrim(@expression) end else begin select @parametre= rtrim(@parametre) + ' AND '+rtrim(@cle)+'='+rtrim(@expression) END--Si c'est le 1er passage where.... sinon c'est and ....
set @compteur=@compteur+1--Compteur d'itérations du curseur
fetch next from curseur1 into @cle
end
set @data=rtrim(@data)
set @query='Select count(*) from ' +@nom_table + rtrim(@parametre)--Requete permettant de savoir si on va insérer ou mettre a jour des données
select @query= replace(@query,'"',char(39))--Remplacement de double quote par simple quote
SET @sql = 'SELECT @i = count(*) from '+rtrim(@nom_table)+' ' + rtrim(@parametre)--Construction de la requete avec attribution à @i de la valeur renvoyée par la requete
select @sql= replace(@sql,'"',char(39))
EXEC sp_executesql
@query = @sql,
@params = N'@i INT OUTPUT',
@i = @i OUTPUT
if @i = 0 --Dans le cas ou l'enregistrement avec la clé spécifiée n'existe pas(@i=0)---->insertion
begin
select @query='insert into ' + rtrim(@nom_table) + '(' + rtrim(@champs) + ') values("' + rtrim(@data) +'")'
end
else--Dans le cas ou l'enregistrement avec la clé spécifiée existe déja (@i<>0)---->Mise a jour
begin
set @query='update '+ rtrim(@nom_table) + ' set '
declare curseur2 CURSOR for SELECT column_name FROM INFORMATION_SCHEMA.columns WHERE table_name =@nom_table --Curseur parcourant les champs de la table spécifiée
open curseur2
fetch curseur2 into @champ
set @compteur=0
while @@FETCH_STATUS=0
begin
set @longueur=len(@data)--Récupération de la longueur de la chaine de caracteres a insérer dans la base de données
set @position=PATINDEX('%,%',@data)--Récupération de la position de la premiere virgule(séparateur de champs) dans la chaine
set @expression=substring(@data,0,@position)--Cette variable prend successivement les valeurs des champs à insérer dans la base
set @data=substring(@data,@position+1,@longueur - @position)--On enleve de la chaine de caracteres le champ qui vient d'etre inséré dans la chaine d'insertion
if @compteur=0 begin set @query=rtrim(@query) + ' '+rtrim(@champ) + ' ="' + rtrim(@expression) + ',' end else begin set @query=rtrim(@query) + ' '+rtrim(@champ) + ' =' + rtrim(@expression) + ',' END
fetch next from curseur2 into @champ--Enregistrement suivant.
set @compteur=@compteur+1--Compteur d'itérations du curseur
end
set @longueur=len(@query)
set @query=substring(@query,0,@longueur)
set @query=rtrim(@query)+ rtrim(@data)+ '"'+' ' + rtrim(@parametre) --Construction de la fin de la requete avec les critères de sélection sur les clés
close curseur2-- Fermeture du curseur2
deallocate curseur2-- Suppression de la mémoire du curseur2
end
close curseur1-- Fermeture du curseur1
deallocate curseur1-- Suppression de la mémoire du curseur1
select @query= replace(@query,'"',char(39))--Remplacement ds la requete du double quote par le simple quote
EXEC(@query)--Exécution de la requete
end
GO |
Partager