2017-07-17 1 views
0

J'essaie de faire un curseur sur une base de données SQL Server pour obtenir toutes les valeurs distinctes de chaque table. Je veux la table avec des valeurs pour ressembler à ceci:Curseur pour obtenir toutes les valeurs distinctes de chaque table et champ sur SQL Server 2008

Database Schema Table Field Value 
    A   dbo  T1  F1  1 
    A   dbo  T1  F1  2 
    A   dbo  T1  F1  3 
    ...  ...  ... ...  ... 

Mon problème est que lorsque je tente de mettre le nom de base de données, avec QUOTENAME (TABLE_CATALOG), Il n'évalue pas la fonction, et au lieu, il écrit la fonction dans la table que je veux générer. J'ai essayé avec des guillemets simples ou doubles sans résultats.

Comment écrire la requête? Merci!

Set Nocount ON 

DECLARE cur CURSOR FOR 
SELECT 'SELECT DISTINCT ' + ''' QUOTENAME(TABLE_CATALOG) + '''+' As DBName,'+ + QUOTENAME(c.COLUMN_NAME) + ' AS Datos' + ' FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS AS c 
WHERE c.DATA_TYPE LIKE '%char%' 

DECLARE @cmd VARCHAR(MAX); 
OPEN cur; 

FETCH NEXT FROM cur INTO @cmd; 
WHILE @@FETCH_STATUS = 0 

BEGIN 
PRINT @cmd 
EXEC(@cmd); 
FETCH NEXT FROM cur INTO @cmd; 
END 

CLOSE cur; 
DEALLOCATE cur; 

Set Nocount OFF 

BTW: Je pris le code et édité à partir d'un exemple (Get distinct values from each table and each column with SQL Server)

+1

Vous ne devez pas utiliser les vues INFORMATION_SCHEMA pour obtenir le schéma d'un objet. MS admet qu'ils ne sont pas fiables. https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/columns-transact-sql –

+0

Re INFORMATION_SCHEMA et la détermination des schémas: https://stackoverflow.com/a/ 7310746/121544 –

+0

Merci à ce sujet .. Je n'avais aucune idée que ce n'était pas fiable. –

Répondre

0

Vous n'avez pas des citations tout à fait raison avec le ''' QUOTENAME(TABLE_CATALOG) + '''. Il devrait être ''' + QUOTENAME(TABLE_CATALOG) + '''.

Les citations sont échappées en les doublant, par ex.

SELECT 'blah' --> blah 
SELECT 'it''s' --> it's 
SELECT ' Alex''' + 's pen' --> Alex's pen 

Erreur de syntaxe

SELECT 'it's' --> syntax error 

La requête finie est ici:

SET NOCOUNT ON 

DECLARE cur CURSOR FOR 
SELECT 'SELECT DISTINCT ''' + QUOTENAME(TABLE_CATALOG) + ''' As DBName, ''' + QUOTENAME(TABLE_SCHEMA) + ''' AS [Schema], ''' + QUOTENAME(COLUMN_NAME) + ''' AS ColumnName, ' 
    + QUOTENAME(c.COLUMN_NAME) + ' AS Datos ' + 
    'FROM ' + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS AS c 
WHERE c.DATA_TYPE LIKE '%char%' 

DECLARE @cmd VARCHAR(MAX); 
OPEN cur; 

FETCH NEXT FROM cur INTO @cmd; 
WHILE @@FETCH_STATUS = 0 

BEGIN 
PRINT @cmd 
EXEC(@cmd); 
FETCH NEXT FROM cur INTO @cmd; 
END 

CLOSE cur; 
DEALLOCATE cur; 

SET NOCOUNT OFF 

Notes:

  • Supprimer QUOTENAME si vous ne voulez pas la chaîne à être entouré [] (brakets carrés)
  • Un commentaire sur INFORMATION_SCHEMA.COLUMNS: pour vos besoins cette vue va retourner les données correctes comme indiqué dans le https://stackoverflow.com/a/7310746/6305294 (commentaire de @ShannonSeverance). Ce qui manque à cette vue, ce sont des informations détaillées sur les propriétés des colonnes.
+0

Merci, cela a fonctionné comme prévu! Et merci pour la déclaration sur Information_Shema –