Comment supprimer toutes les lignes pouvant être supprimées?

Existe-t-il un moyen dans SQL Server pour supprimer chaque ligne qui est supprimable (n'a pas les foreign keys empêchant la suppression) sans avoir à connaître chaque reference de key étrangère?

Je sais que je peux vérifier avec WHERE ID NOT IN (..) ou une LEFT OUTER JOIN pour chaque contrainte, mais y at-il quelque chose comme

 DELETE * FROM MyTable WITH CONTINUE_ON_ERROR 

cela essaierait simplement de supprimer chaque logging et si une erreur survient l'ignorer et continuer avec l'logging suivant sans rouler la transaction en arrière?

Vous pouvez le faire avec le cursor utilisant try catch block:

 DECLARE @id int DECLARE curs CURSOR FAST_FORWARD FOR SELECT ID FROM MyTable OPEN curs FETCH NEXT FROM curs INTO @id WHILE @@FETCH_STATUS = 0 BEGIN BEGIN TRY DELETE FROM MyTable WHERE id = @id END TRY BEGIN CATCH END CATCH FETCH NEXT FROM curs INTO @id END CLOSE curs DEALLOCATE curs 

J'ai écrit du code SQL qui va écrire toutes les jointures pour vous, puis returnner là où il n'y a pas de correspondance pour les jointures. Juste pointez-le à votre table. Ensuite, si vous voulez supprimer puis supprimer de votre table où pk_col IN (ma requête créée dynamicment)

 DECLARE @TableName VARCHAR(100) = 'yourTable', @LeftJoins VARCHAR(MAX), @WherePredicates VARCHAR(MAX); WITH CTE_FK_PK AS ( SELECT FK_Table = FK.TABLE_NAME, FK_Column = CU.COLUMN_NAME, PK_Table = PK.TABLE_NAME, PK_Column = PT.COLUMN_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME INNER JOIN ( SELECT i1.TABLE_NAME, i2.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' ) PT ON PT.TABLE_NAME = PK.TABLE_NAME WHERE PK.TABLE_NAME = @TableName ) SELECT @LeftJoins = COALESCE(@LeftJoins + CHAR(10),'') + 'LEFT JOIN ' + FK_Table + ' ON ' + FK_Table + '.' + FK_Column + ' = ' + PK_Table + '.' + PK_Column, @WherePredicates = COALESCE(@WherePredicates + CHAR(10) + 'AND ','') + FK_Table + '.' + FK_Column + ' IS NULL ' FROM CTE_FK_PK SELECT 'SELECT pk_col FROM ' + @TableName + ' ' + @LeftJoins + ' WHERE ' + @WherePredicates 

Si vous avez vraiment besoin de faire cela, vérifiez chaque contrainte.

Vous pouvez utiliser un slider pour faire défiler chaque input et l'emballer dans une tentative d'attraper mais c'est horrible et cela va causer de la douleur et de la misère pour vous et quiconque doit supporter votre application / database.