2017-06-30 5 views
1

J'essaie de supprimer des données d'un certain nombre de tables dans ma base SQL.Requête SQL pour supprimer des données des tables définies dans le tableau

Dans la base de données, j'ai une table appelée company qui contient les noms de chaque table dont j'ai besoin de supprimer des données.

laisse supposer que j'ai 3 entreprises dans ma table de compagnie.

Ce que je veux faire est de supprimer tous les enregistrements dans certains tableaux de chaque société.

Ainsi, dans le tableau de la société que j'ai les 3 documents suivants:

1 2 3 

Il y a aussi les tableaux suivants dans la base de données qui représente les documents numérisés de chaque entreprise.

dbo.1.documents 
dbo.2.documents 
dbo.3.documents 

Ce que je suis en train de faire est de créer une requête SQL qui se déroulera à travers la table dbo.company et effacer les tables de document sur la base des noms de sociétés qui s'y trouvent.

Ceci est mon code:

DECLARE @MyCursor CURSOR; 
DECLARE @MyField varchar; 
BEGIN 
SET @MyCursor = CURSOR FOR 
select top 1000 [Name] from dbo.Company  

OPEN @MyCursor 
FETCH NEXT FROM @MyCursor 
INTO @MyField 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    delete * from 'dbo.'[email protected]+'$documents' 

    FETCH NEXT FROM @MyCursor 
    INTO @MyField 
END; 

CLOSE @MyCursor ; 
DEALLOCATE @MyCursor; 
END; 

Je ne sais pas comment la syntaxe devrait aller, mais je l'imagine est quelque chose comme ça. Quelqu'un veut-il se renseigner sur la façon dont je peux supprimer dynamiquement les données en fonction des enregistrements dans le fichier dbo.company.name?

+0

Pouvez-vous utiliser php pour cette tâche? –

+0

Non, je crains que ce soit uniquement une requête SQL – AronChan

+1

Est-ce NAV? Vous pouvez obtenir de l'aide supplémentaire si vous marquez avec le produit dynamique que vous utilisez. –

Répondre

6

Utilisez SQL dynamique.

Remplacer la suppression-déclaration avec le code ci-dessous (le déclarer peut être fait au début):

DECLARE @sql NVARCHAR(1000) 
SET @sql = N'delete from dbo.'+CONVERT(VARCHAR,@MyField)+'documents' 
EXEC sp_executesql @sql 
+0

Cela a résolu mon problème complètement. Je devais ajouter une longueur à la variable varchar dans votre converti mais à part ça c'était impeccable. – AronChan

+1

La performance sur delete est un peu manquant donc je l'ai changé pour utiliser la table tronquée (il y a beaucoup de données dans ces tableaux) Mais encore une fois. Merci - Travaillé parfaitement – AronChan

1

Vous pouvez exploiter sql dynamique un peu différemment et d'éviter tous les tracas et les frais généraux de créer un curseur pour ce. J'utilise les valeurs de votre table pour générer un certain nombre d'instructions delete et ensuite les exécuter. C'est beaucoup moins d'effort pour coder et élimine ce curseur méchant.

declare @SQL nvarchar(max) = '' 

select @SQL = @SQL + 'delete dbo.[' + c.Name + '$documents];' 
from dbo.Company 

select @SQL --uncomment the line below when you are satisfied the dynamic sql is correct 
--exec sp_executesql @sql 
+1

Passer la requête dynamique satisfaisante à 'sp_executesql' sera plus productif. '@ SQL' n'a pas atteint la dernière ligne. – HABO