Existe-t-il un moyen d'utiliser SQL Server Management Studio pour rechercher toutes les colonnes dont les noms de colonne contiennent une certaine sous-chaîne?

11

J'utilise SQL Server Management Studio 2008.

J'ai une énorme base de données héritée avec des milliers de colonnes. Ce serait bien si je pouvais rechercher toutes les colonnes dont les noms contiennent une certaine sous-chaîne.

Est-ce que quelqu'un sait comment faire ça?

Merci!

IsaacB
la source
1
Je fais ce genre de chose avec mon propre script de fichier batch, en utilisant un projet Java appelé schemacrawler pour faire le travail.
djangofan

Réponses:

16

Mmhh vous pourriez essayer:

use <your_database>
select o.name,c.name 
from sys.columns c inner join sys.objects  o on c.object_id=o.object_id 
and o.type = 'U'
and CHARINDEX('<your_sub_string>', c.name)>=1
Stef
la source
ah, donc il n'y a pas d'écran sympa pour cela.
IsaacB
Ok, qu'est-ce que tu veux exactement :)?
Stef
sys.columns ne semble pas exister pour moi,
j'examine
Si vous ne pouvez pas les "voir" c'est parce que vous n'avez pas les bonnes autorisations. Pouvez-vous DONNER?
Stef
J'ai interrogé une vieille base de données SQL Server 2000 par accident depuis le studio 2008. Votre script fonctionne réellement, merci beaucoup.
IsaacB
2

Vous pouvez utiliser des outils tiers comme la recherche SQL de Red-Gate qui sont gratuits.

jgardner04
la source
J'ai quelque chose de Red Gate installé, peut-être que je vais vérifier et voir si j'ai une recherche SQL. Merci!
IsaacB
2

Vous pouvez utiliser les vues INFORMATION_SCHEMA.

USE <database>

SELECT COLUMN_NAME
     , TABLE_NAME     
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%<string you are looking for>%'

Un hic est de s'assurer d'utiliser la base de données correcte.

CTKeane
la source
0
USE <database>;

Declare @Col varchar(10);
Declare @Val varchar(10);
Declare @tablename varchar(20);
Declare @sql nvarchar(200);
Declare @sql1 nvarchar(200);

SET @Col = '...';   --INSERT COLUMN NAME
SET @Val = ...; -- INSERT COLUMN VALUE

IF OBJECT_ID('tempdb.dbo.##TempTable1', 'U') IS NOT NULL
DROP TABLE ##TempTable1;

SELECT NULL AS MYKEY, name
into ##TempTable1
FROM sysobjects
WHERE id IN ( SELECT id FROM syscolumns WHERE name = @Col )
ORDER BY name asc

set rowcount 1

update ##TempTable1 set mykey = 1

while @@rowcount > 0
begin
    set rowcount 0

    set @tablename =  (select name from ##TempTable1 where mykey = 1)
    set @sql = 'If Exists (SELECT * FROM '+@tablename+' WHERE '+@Col+'='+@Val+') SELECT * FROM '+@tablename+' WHERE '+@Col+'='+@Val+';'
    set @sql1 = 'If Exists (SELECT * FROM '+@tablename+' WHERE '+@Col+'='+@Val+') select name from ##TempTable1 where mykey = 1'
    EXEC sp_executesql @sql1
    EXEC sp_executesql @sql

    delete ##TempTable1 where mykey = 1
        set rowcount 1
    update ##TempTable1 set mykey = 1
end
set rowcount 0
GeorgeB
la source