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
Répondre
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
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.
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
Maintenant, c'est le genre de chose pour laquelle les boucles ont été inventées. – HLGEM
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
- 1. Comment indexez-vous les fichiers pour les recherches rapides?
- 2. Voulez-vous vérifier le jour existe déjà
- 3. Vous voulez récupérer les données de base de données
- 4. Linux - Vous voulez vérifier pour les répertoires en double possibles (probablement regex nécessaire)
- 5. Vous voulez énumérer les dossiers Outlook
- 6. Logiciel de bases de données pour les requêtes rapides
- 7. Vous voulez résumer certains champs et laisser les autres seuls SQL
- 8. Vous voulez les données de Upline et Downline pour ID particulier
- 9. vérifier si les valeurs de champs existent?
- 10. Stratégies pour vérifier ISNULL sur les champs varbinary?
- 11. Comment stockez-vous les champs de variables?
- 12. Que devez-vous vérifier dans les champs de texte du formulaire HTML?
- 13. Comment voulez-vous que les échantillons SDK soient présentés?
- 14. C# équivalent de typeof pour les champs
- 15. Vous voulez rediriger tous les visiteurs sauf moi
- 16. Vous voulez utiliser les méthodes GET et POST
- 17. Comment optimiser une table pour les insertions rapides seulement?
- 18. mssql_query() champs vides pour les champs datetime
- 19. Requêtes SQL simples et rapides pour les fichiers plats
- 20. Vous voulez comprendre l'autorisation, les cookies, les utilisateurs se connecte, les sessions
- 21. Que utilisez-vous si vous voulez vous assurer que toutes les méthodes et propriétés sont implémentées
- 22. PHP: Commentaires sur les questions rapides
- 23. mysql_fetch_array pour les champs booléens?
- 24. Vous voulez trouver des données de date en shell python
- 25. Traitement des touches rapides sur les boutons
- 26. Vous voulez migrer vers Rake?
- 27. Quelle méthode Python suggéreriez-vous pour vérifier les enregistrements de base de données whois?
- 28. Vous voulez restaurer la base de données master ....?
- 29. Comment vérifier si tous les champs sont uniques dans Oracle?
- 30. Comment échouez-vous les données?
Par vide, voulez-vous dire NULL valeur pour toutes les lignes? –
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. –