2010-11-17 3 views
0

Existe-t-il un script permettant à MSSQL de trouver des colonnes avec des enregistrements ayant les mêmes données dans plusieurs tables. Ce que je veux faire est de trouver les clés primaires aux tables de données que nous avons importées des feuilles de calcul d'Excel qui ont été faites à partir d'une autre base de données.MSSQL Recherche les colonnes correspondantes dans les tables sans relations définies

Merci, Chris

+0

est l'autre base de données locale ou à distance? Est-ce SQL Server aussi bien? Quelles versions ... –

+0

Les tables ont toutes été importées dans la même base de données. C'est sur MSSQL Server 2008. –

+1

Vous aurez besoin de fournir plus d'informations pour obtenir de l'aide sur celui-ci. SQL n'est pas une boîte magique qui peut lire dans votre esprit, donc la réponse est très probablement non. – JohnFx

Répondre

0

Vous allez vouloir regarder les SysObjects et tables système SYSCOLUMN, très pratique pour ce genre de chose.

Voici un exemple qui parcourt toutes les tables pour la valeur entière 500. Notez que si vous souhaitez rechercher un autre type de colonne, vous devrez modifier le type xtype. Il ne s'agit pas d'un exemple complet de comparaison entre les colonnes de ma base de données et les autres colonnes. Cependant, il devrait vous donner l'idée de base et, espérons-le, vous aider à démarrer.

En outre, j'utilise une table de mémoire pour cet exemple. Si votre base de données est grande, vous voudrez utiliser une table temporaire et un curseur probable.

Ceci retourne une seule colonne d'enregistrements avec la valeur de « Tableau - ColumnName = Recherche Valeur »

-- declare my search table 
DECLARE @Columns TABLE (TableName varchar(50), ColumnName varchar(50)) 
DECLARE @Results TABLE (Results VARCHAR(255)) 
DECLARE @SearchData INT 
SET @SearchData = 500 

DECLARE @TableName VARCHAR(50) 
DECLARE @ColumnName VARCHAR(50) 
DECLARE @Command VARCHAR(1024) 

-- Find all tables with an integer column 
Insert INTO @Columns 
    Select sysobjects.[Name] as TableName, syscolumns.[Name] as ColumnName 
     from dbo.sysobjects INNER Join dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id 
     Where sysobjects.xtype = 'U' and syscolumns.xtype = 56 Order By TableName, ColumnName 

--Loop! 
WHILE NOT (Select TOP 1 TableName from @Columns) IS NULL 
    BEGIN 
     Select TOP 1 @TableName = TableName, @ColumnName = ColumnName from @Columns 

     SET @Command = 'Select ''' + @TableName + ' - ' + @ColumnName + ' = ' + CAST(@SearchData as varchar(32)) + ''' FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ' + CAST(@SearchData as VARCHAR(32)) 
     Insert INTO @Results 
      exec(@Command) 

     Delete from @Columns where TableName = @TableName AND ColumnName = @ColumnName 
    END 


-- Export all results 
Select * from @Results 
+0

Je reçois cette erreur lorsque j'essaie d'exécuter votre requête. –

+0

Msg 8152, niveau 16, état 2, ligne 12 Les données chaîne ou binaires sont tronquées. La déclaration a été terminée. –

+0

Remplacez @Results par DECLARE @Results TABLE (Résultats VARCHAR (2048)) qui devrait être assez grand indépendamment de vos données si vous cherchez toujours des entiers. De plus, si l'une de vos colonnes ou tables contient des noms de plus de 50 caractères, vous devrez également modifier ces variables. –

Questions connexes