2010-06-16 6 views
0

Nous avons une configuration de base de données qui se compose de deux parties: une structure statique et des ajouts dynamiques. Pour chaque base de données, la dynamique peut être différente, et parfois nous n'avons pas de données pour tous les champs dynamiques. Rigt maintenant, nous vérifions les vides en regardant le nombre total d'enregistrements dans le tableau entier, mais nous voulons passer à une méthode plus fine de vérification des vides si possible. Est-il possible de vérifier rapidement plusieurs centaines de champs et de voir lesquels sont vides et lesquels sont peuplés?Vous voulez vérifier les champs pour les données rapides

+0

Par vide, voulez-vous dire NULL valeur pour toutes les lignes? –

+0

Les champs peuvent être null ou peuvent avoir '' (chaîne vide) en eux, bien que je veux me concentrer sur les valeurs nulles pour le moment et ensuite obtenir les vides regardés plus tard. –

Répondre

0

pour rechercher toutes les lignes qui ont NULLS dans une colonne que vous pouvez faire cela, tout d'abord créer ce proc qui est basé sur le code ici Search all columns in all the tables in a database for a specific value

CREATE PROCEDURE FindMyData_StringNull 
    @DataToFind NVARCHAR(4000), 
    @ExactMatch BIT = 0 
AS 
SET NOCOUNT ON 

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT) 

    INSERT INTO @Temp(TableName,SchemaName, ColumnName, DataType) 
    SELECT C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type 
    FROM Information_Schema.Columns AS C 
      INNER Join Information_Schema.Tables AS T 
       ON C.Table_Name = T.Table_Name 
     AND C.TABLE_SCHEMA = T.TABLE_SCHEMA 
    WHERE Table_Type = 'Base Table' 



DECLARE @i INT 
DECLARE @MAX INT 
DECLARE @TableName sysname 
DECLARE @ColumnName sysname 
DECLARE @SchemaName sysname 
DECLARE @SQL NVARCHAR(4000) 
DECLARE @PARAMETERS NVARCHAR(4000) 
DECLARE @DataExists BIT 
DECLARE @SQLTemplate NVARCHAR(4000) 

SELECT @SQLTemplate = 'If Exists(Select * 
              From ReplaceTableName 
              Where Convert(nVarChar(4000), [ReplaceColumnName]) 
                 IS NULL 
             ) 
            Set @DataExists = 1 
           Else 
            Set @DataExists = 0' 
          , 
     @PARAMETERS = '@DataExists Bit OUTPUT', 
     @i = 1 

SELECT @i = 1, @MAX = MAX(RowId) 
FROM @Temp 

WHILE @i <= @MAX 
    BEGIN 
     SELECT @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName) 
     FROM @Temp 
     WHERE RowId = @i 


     PRINT @SQL 
     EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT 

     IF @DataExists =1 
      UPDATE @Temp SET DataFound = 1 WHERE RowId = @i 

     SET @i = @i + 1 
    END 

SELECT SchemaName,TableName, ColumnName 
FROM @Temp 
WHERE DataFound = 1 

Appelez comme ça

FindMyData_StringNull NULL,1 
0

En supposant que vous vérifiez simplement s'il existe ou non des valeurs non-NULL dans la colonne, l'utilisation de EXISTS devrait généralement être plus rapide que l'obtention d'un COUNT (*). Le COUNT doit balayer toute la table pour trouver le bon numéro. EXISTS a juste besoin de trouver une ligne qui satisfait la condition avant de cesser de chercher.

Si la colonne entière est NULL, l'heure sera à peu près la même, mais dans tous les cas où vous avez des valeurs, elle pourrait être sensiblement plus courte.

0

De Search all columns in all the tables in a database for a specific value

d'abord créer cette fonction

CREATE PROCEDURE FindMyData_String 
    @DataToFind NVARCHAR(4000), 
    @ExactMatch BIT = 0 
AS 
SET NOCOUNT ON 

DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT) 

    INSERT INTO @Temp(TableName,SchemaName, ColumnName, DataType) 
    SELECT C.Table_Name,C.TABLE_SCHEMA, C.Column_Name, C.Data_Type 
    FROM Information_Schema.Columns AS C 
      INNER Join Information_Schema.Tables AS T 
       ON C.Table_Name = T.Table_Name 
     AND C.TABLE_SCHEMA = T.TABLE_SCHEMA 
    WHERE Table_Type = 'Base Table' 
      And Data_Type In ('ntext','text','nvarchar','nchar','varchar','char') 


DECLARE @i INT 
DECLARE @MAX INT 
DECLARE @TableName sysname 
DECLARE @ColumnName sysname 
DECLARE @SchemaName sysname 
DECLARE @SQL NVARCHAR(4000) 
DECLARE @PARAMETERS NVARCHAR(4000) 
DECLARE @DataExists BIT 
DECLARE @SQLTemplate NVARCHAR(4000) 

SELECT @SQLTemplate = CASE WHEN @ExactMatch = 1 
          THEN 'If Exists(Select * 
              From ReplaceTableName 
              Where Convert(nVarChar(4000), [ReplaceColumnName]) 
                 = ''' + @DataToFind + ''' 
             ) 
            Set @DataExists = 1 
           Else 
            Set @DataExists = 0' 
          ELSE 'If Exists(Select * 
              From ReplaceTableName 
              Where Convert(nVarChar(4000), [ReplaceColumnName]) 
                 Like ''%' + @DataToFind + '%'' 
             ) 
            Set @DataExists = 1 
           Else 
            Set @DataExists = 0' 
          END, 
     @PARAMETERS = '@DataExists Bit OUTPUT', 
     @i = 1 

SELECT @i = 1, @MAX = MAX(RowId) 
FROM @Temp 

WHILE @i <= @MAX 
    BEGIN 
     SELECT @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName) 
     FROM @Temp 
     WHERE RowId = @i 


     PRINT @SQL 
     EXEC SP_EXECUTESQL @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT 

     IF @DataExists =1 
      UPDATE @Temp SET DataFound = 1 WHERE RowId = @i 

     SET @i = @i + 1 
    END 

SELECT SchemaName,TableName, ColumnName 
FROM @Temp 
WHERE DataFound = 1 

appeler maintenant comme ça pour les lignes avec des chaînes vides dans toutes les colonnes de type chaîne

exec FindMyData_String '',1 

il vous donnera une sortie avec Nom de la colonne, nom de la table et nom du schéma Gardez juste à l'esprit qu'il va chercher dans tous les tableaux

+0

Maintenant, c'est le genre de chose pour laquelle les boucles ont été inventées. – HLGEM

0

Je pense que la solution la plus simple est d'utiliser la fonction CHECKSUM. D'abord vous voudriez déterminer la somme de contrôle sur une rangée vide et ensuite la comparer aux autres rangées.

Select Checksum(*) 
From Table 

Les prises avec l'utilisation * est ici qu'il comprendra le PK. Vous devrez probablement spécifier les colonnes individuelles à l'exclusion du PK pour obtenir une lecture précise. Donc, quelque chose comme:

Select Checksum(Col1, Col2, Col3) 
From Table 

Checksum Function.

Questions connexes