août
2011
Pour faire une photo des données d’une ou plusieurs table. Cette méthode permet de réaliser :
* rapidement des jeux de données pour des tests
* des snapshots des données des tables avant une opération et va donc permettre un retour arrière rapide au cas où ….
Pour une base en production, cette méthode ne garantie pas la consistance des données dans la base.
– ===============================================================================
–> Description : Réalise une copie des data d'une ou plusieurs tables
–> Exemple d'utilisation :
– EXEC P_LoadData N'dbo.T_PARENT,dbo.T_FILLE'
– /!\ 1. Attenttion la consistance des données n'est pas garantie entre les tables T_PARENT et T_FILLE
– 2. La Procedure stockée P_LoadData utilisee la fonction F_SQLSplit disponible sur mon blog
–> Auteur : Etienne ZINZINDOHOUE
– =================================================================================
CREATE PROCEDURE [dbo].[P_LoadData]
@ListeDesTables VARCHAR(max)
AS
BEGIN TRY
SET NOCOUNT ON
DECLARE @TableDesTables TABLE (id int identity, NomTable varchar(100))
DECLARE @Id_Courant INT
DECLARE @TableEnTraitement VARCHAR(100)
DECLARE @SQL VARCHAR(max)
DECLARE @i INT = 1
–Insertion des tables traiter dans la table des tables
INSERT INTO @TableDesTables (NomTable)
SELECT ChaineSplit FROM dbo.F_SQLSplit(@ListeDesTables,',')
–Chargement des donnes des tables
SELECT @Id_Courant = SCOPE_IDENTITY();
WHILE @i <= @Id_Courant
BEGIN
SELECT @TableEnTraitement = NomTable
FROM @TableDesTables
WHERE id = @i
SET @SQL = 'SELECT * INTO ' + @TableEnTraitement + '_LoadData' + '_'+ REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(23), GETDATE(), 121),'.','_'),':','_'),'-','_'),' ','_') + ' ' + 'FROM ' + @TableEnTraitement +''
–PRINT @SQL
EXEC (@SQL)
SET @i += 1
END
END TRY
BEGIN CATCH
SELECT ' Erreur dans la procedure [P_LoadData]'
END CATCH
La fonction F_SQLSplit est la suivante
–=============================================================================================================================
–> Description : Split une chaine de caractères en fonction du séparateur fournit en entrée
–> Exemple d'utilisation :
– SELECT * FROM dbo.F_SQLSplit('Service:Relation clients:1-Qualification:Renseignement technique:1',':’)
–> Auteur : Etienne ZINZINDOHOUE
–=============================================================================================================================
CREATE FUNCTION [dbo].[F_SQLSplit] (@ChaineASpliter varchar(1024),@Seperateur char(1))
RETURNS @T_Split TABLE (IdSplit int ,ChaineSplit varchar(1024))
AS
BEGIN
DECLARE @i INT = 1
DECLARE @j INT
– Suppression des séparateurs inutiles se trouvant au début de la chaine à spliter
WHILE (SUBSTRING(@ChaineASpliter,1,1)) = @Seperateur
BEGIN
SET @ChaineASpliter = SUBSTRING(@ChaineASpliter,2,LEN(@ChaineASpliter)-1)
SET @i += 1
END
– Suppression des séparateurs inutiles se trouvant à la fin de la chaine à spliter
SET @j = LEN(@ChaineASpliter)
WHILE (SUBSTRING(@ChaineASpliter,@j,1)) = @Seperateur
BEGIN
SET @ChaineASpliter = SUBSTRING(@ChaineASpliter,1,@j -1)
SET @j -= 1
END
BEGIN
;WITH CTE_Split(Id, InitPosition, PositionSeparateur) AS (
SELECT 1, 1, CHARINDEX(@Seperateur, @ChaineASpliter)
UNION ALL
SELECT id + 1, PositionSeparateur + 1, CHARINDEX(@Seperateur, @ChaineASpliter, PositionSeparateur + 1)
FROM CTE_Split
WHERE PositionSeparateur > 0
)
INSERT @T_Split(IdSplit,ChaineSplit)
SELECT id,
SUBSTRING(@ChaineASpliter,InitPosition,
CASE
WHEN PositionSeparateur > 0 THEN PositionSeparateur-InitPosition
ELSE 1024
END) AS Split
FROM CTE_Split
RETURN;
END
END
GO
———————————————-
Etienne ZINZINDOHOUE
———————————————-