J'ai une table dans la database structurée comme ci-dessous.
col1 col2 col3 col4 col5 col6 frnkeyid1 frnkeyid2 ----------------------------------------------------------- a 2 3 2 4 b 1 4 2 5 c 12 5 2 6
Dans le tableau ci-dessus, aucune donnée n'est insérée dans col4
, col5
et col6
. Maintenant, je veux écrire une procédure / requête qui supprime toutes les colonnes de la table de résultats où aucune valeur n'est input pour cette colonne.
Fe le résultat pour le tableau ci-dessus:
col1 col2 col3 frnkeyid1 frnkeyid2 ----------------------------------------- a 2 3 2 4 b 1 4 2 5 c 12 5 2 6
Comment puis-je faire ceci?
Tu peux essayer ça.
-- For obtain used columns DECLARE @ColNames NVARCHAR(MAX) ='' SELECT @ColNames = @ColNames + ', ' + QUOTENAME(ColNames) FROM MyTable UNPIVOT( V FOR ColNames IN ([col1],[col2],[col3],[col4],[col5],[col6],[frnkeyid1],[frnkeyid2])) UNPVT GROUP BY QUOTENAME(ColNames) DECLARE @query NVARCHAR(MAX) = 'SELECT ' + STUFF(@ColNames,1,1,'') + ' FROM MyTable' EXEC (@query)
Résultat:
col1 col2 col3 frnkeyid1 frnkeyid2 ----------- ----------- ----------- ----------- ----------- 1 2 3 2 4 2 1 4 2 5 3 12 5 2 6
Cette solution supprime littéralement toutes les colonnes de la table de résultats
Vous devez utiliser SQL dynamic. Laissez-moi montrer un exemple.
Je suppose, no data
signifie NULL
.
CREATE TABLE dbo.test ( col1 char(1), col2 int, col3 int, col4 int, col5 int, col6 int, frnkeyid1 int, frnkeyid2 int ) INSERT INTO dbo.test VALUES ('a', 2, 3, NULL, NULL, NULL, 2, 4), ('b', 1, 4, NULL, NULL, NULL, 2, 5), ('c', 12, 5, NULL, NULL, NULL, 2, 6)
C'est une déclaration de table de test. Pour créer une requête et l'exécuter, utilisez ce code:
DECLARE @TableName sysname = N'test', @SQLQuery nvarchar(max) = N'' SELECT @SQLQuery = @SQLQuery + N' IF ( SELECT CASE WHEN COUNT(DISTINCT '+ QUOTENAME(c.[name]) +') = 0 AND MAX(' + QUOTENAME(c.[name]) +') IS NULL THEN 1 ELSE 0 END FROM ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(t.[Name]) + ') = 1 BEGIN ALTER TABLE ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(@TableName) + ' DROP COLUMN '+ QUOTENAME(c.[name]) +' PRINT ''Column name '+ QUOTENAME(c.[name]) + ' was droped from table ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(@TableName) + ''' END;' FROM sys.tables t INNER JOIN sys.columns c ON t.[object_id] = c.[object_id] INNER JOIN sys.schemas s On t.[schema_id] = s.[schema_id] WHERE t.[name] = @TableName PRINT @SQLQuery --EXEC (@SQLQuery)
La déclaration PRINT vous donnera cette
IF ( SELECT CASE WHEN COUNT(DISTINCT [col1]) = 0 AND MAX([col1]) IS NULL THEN 1 ELSE 0 END FROM [dbo].[test]) = 1 BEGIN ALTER TABLE [dbo].[test] DROP COLUMN [col1] PRINT 'Column name [col1] was droped from table [dbo].[test]' END;
Pour chaque colonne.
Donc, s'il n'y a pas de valeurs, la colonne sera supprimée. Vous pouvez supprimer
ALTER TABLE dbo.[test] DROP COLUMN [col1]
Et exécuter le script pour voir, quelles colonnes seront supprimées de la table.
Si vous exécutez ce script sur la table de test, effectuez les opérations suivantes:
SELECT * FROM dbo.test
Cela vous amènera:
col1 col2 col3 frnkeyid1 frnkeyid2 a 2 3 2 4 b 1 4 2 5 c 12 5 2 6