Sélectionnez une colonne par rapport à la cellule contenant

J'ai une table nommée a. Certaines cellules contenant une string 'Vide' dans plusieurs colonnes. Je veux find ces colonnes. Pouvez-vous m'aider?.

Essayez cette requête dynamic, il va vérifier toutes les colonnes avec des données de caractères et la list des colonnes qui a le mot «vide».

 DECLARE @SearchText VARCHAR(50) = 'Empty' DECLARE @sql NVARCHAR(MAX) = 'SELECT ' SELECT @sql = @sql + 'MAX(CASE WHEN ' + c.COLUMN_NAME + ' LIKE ''%'+ @SearchText +'%'' THEN ''' + c.COLUMN_NAME +''' ELSE '''' END) + '','' + ' FROM INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_SCHEMA = 'dbo' and c.TABLE_NAME = 'a' AND c.DATA_TYPE IN ('varchar','char','nvarchar','nchar','sysname') SET @sql = @sql + ''''' FROM dbo.a' EXEC sys.sp_executesql @sql 

J'espère que cela t'aides

Utilisez l'opérateur LIKE :

 SELECT a.* FROM a WHERE a.col1 LIKE '%Empty%' OR a.col2 LIKE '%Empty%' OR ... 

Dans le server SQL, vous pouvez get l'ID de l'object de la table, puis en utilisant cet ID d'object, vous pouvez récupérer les colonnes. Dans ce cas ce sera comme ci-dessous:

Étape 1: Obtenir d'abord l'identifiant de l'object de la table

 select * from sys.tables order by name 

Étape 2 : Obtenez maintenant les colonnes de votre table et searchz-y:

  select * from a where 'Empty' in (select name from sys.columns where object_id =1977058079) 

Note: object_id est ce que vous obtenez en première étape pour vous la table pertinente

Vous pouvez le faire en utilisant unpivot avec une aide de requête dynamic, ici j'ai fait ci-dessous un échantillon de travail pour vous, il pourrait y avoir quelques modifications que vous pourriez avoir à faire pour mettre le code psedo ci-dessous avec votre travail.

Exemple de structure de table utilisée:

 create table ColTest ( name1 varchar(10), name2 varchar(10), name3 varchar(10), name4 varchar(10) ) insert into ColTest values ('sdas','asdasda','ewrewr','erefds') insert into ColTest values ('sdas','asdasda','EMPTY','erefds') insert into ColTest values ('EMPTY','asdasda','ewrewr','erefds') DECLARE @table_name SYSNAME SELECT @table_name = 'ColTest' DECLARE @tmpTable SYSNAME SELECT @tmpTable = 'ColTest2' DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = ' SELECT * into ' + @tmpTable + ' FROM ' + @table_name + ' UNPIVOT ( cell_value FOR column_name IN ( ' + STUFF(( SELECT ', [' + c.name + ']' FROM sys.columns c WITH(NOLOCK) LEFT JOIN ( SELECT i.[object_id], i.column_id FROM sys.index_columns i WITH(NOLOCK) WHERE i.index_id = 1 ) i ON c.[object_id] = i.[object_id] AND c.column_id = i.column_id WHERE c.[object_id] = OBJECT_ID(@table_name) AND i.[object_id] IS NULL FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ' ) ) unpiv' PRINT @SQL EXEC sys.sp_executesql @SQL select * from ColTest2 where cell_value = 'EMPTY' 

Je suggérerais SQL dynamic

– Premièrement vous définissez la variable @TableName au @TableName de votre table actuelle.

 DECLARE @TableName VARCHAR(100)='a'; 

– L'instruction suivante crée une list de toutes les colonnes avec un type de données contenant le mot "char" (les autres ne doivent pas contenir la valeur Empty )

 DECLARE @ColList VARCHAR(MAX)= STUFF( ( SELECT ' OR ' + COLUMN_NAME + ' LIKE ''%empty%''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=@TableName AND DATA_TYPE LIKE '%char%' FOR XML PATH('') ),1,4,''); 

-Cette instruction construit une command

 DECLARE @cmd VARCHAR(MAX)= ( SELECT 'SELECT * FROM [' + @TableName + '] WHERE ' + @ColList ); 

– Ici vous pouvez voir la command

 PRINT @cmd; 

– Et ici il est exécuté

 EXEC(@cmd);