0

SQLデータベース全体でデータの文字列を検索できるかどうか疑問に思っていましたか?

特定の列ヘッダーなどを検索できることは知っていますが、単一のデータ文字列を検索する必要があり、データベース (テーブル/列など) のどこに保持されるかわかりません。

出来ますか?保持されている場所の列、テーブル、またはその両方を返すには、どうすればよいですか?

アドバイスをいただければ幸いです。

(SQL Server Management Studio 2005 を使用しています)

4

2 に答える 2

0

最後に使ったスクリプトです。非常に率直で、知っておくべき素晴らしいことです。

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 



exec FindMyData_string 'VBAR2', 0 
于 2012-05-23T13:12:48.790 に答える
0

で始まるスクリプトを書くことができます

select *, COLUMN_NAME, TABLE_NAME 
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = 'your_schema'

そのテーブルと列のリストを使用して、入力を探してそれらすべてを反復処理できます。

于 2012-05-22T15:32:45.203 に答える