127 votes

Comment la recherche base de données sql server pour la chaîne?

Je sais que c'est possible, mais ne savent pas comment.

J'ai besoin de recherche de Microsoft SQL base de données pour toutes les mentions de chaîne de caractères. Par exemple: je voudrais pour rechercher toutes les tables, vues, fonctions, procédures stockées, ... pour la chaîne "tblEmployes". (Pas de données dans les tables)

L'une des raisons pour lesquelles j'ai besoin de ceci, je voudrais supprimer certaines données, les tables sont créées, mais j'ai peur qu'ils sont peut-être utilisé quelque part dans les procédures ou fonctions.

Toute aide est appréciée.

174voto

Yuck Points 6730

cela va chercher toutes les colonnes d'une table dans une base de données spécifique. créer la procédure stockée dans la base de données que vous souhaitez rechercher.

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#2:

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
GO

seulement cela:

exec FindMyData_string 'google', 0

fonctionne étonnamment bien!!!

61voto

marc_s Points 321990

Si vous avez besoin de trouver des objets de base de données (par exemple, des tables, des colonnes, des déclencheurs) sous le nom de regarder le GRATUIT Rouge-Porte-outil, la Recherche SQL qui ne présente - il des recherches de l'ensemble de votre base de données pour tout type de chaîne(s).

enter image description here

enter image description here

C'est un excellent outil pour toute DBA ou développeur de base de données - ai-je déjà dit, il est absolument LIBRE d'utilisation pour tout type d'utilisation??

50voto

George Ober Points 296

Vous pouvez également essayer de ApexSQL de Recherche – il s'agit d'un SSMS ajouter similaire à SQL de Recherche.

Si vous voulez vraiment utiliser uniquement sql, vous pourriez vouloir essayer ce script

select 
S.name as [Schema], 
o.name as [Object], 
o.type_desc as [Object_Type], 
C.text as [Object_Definition]
from sys.all_objects O inner join sys.schemas S on O.schema_id = S.schema_id
inner join sys.syscomments C on O.object_id = C.id
where S.schema_id not in (3,4) -- avoid searching in sys and INFORMATION_SCHEMA schemas
and C.text like '%ICE_%'
order by [Schema]

26voto

Ivan Ivković Points 557

Vous pouvez exporter votre base de données (si petit) à votre disque dur / bureau, puis il suffit de faire une recherche de chaine via l'éditeur de texte. Des acclamations.

17voto

Bojan Skrchevski Points 3908

Pour obtenir une table par le nom de sql server:

SELECT *
FROM sys.Tables
WHERE name LIKE '%Employees%'

pour trouver une procédure stockée par nom:

SELECT name
FROM sys.objects
WHERE name = 'spName'

pour obtenir toutes les procédures stockées associées à une table:

----Option 1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
----Option 2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X