복붙노트

[SQL] 지정된 값이 열 이름을 선택

SQL

지정된 값이 열 이름을 선택

우리는 대량로드 SSIS를 통해 SQL Server 테이블로 나중에 내부 구조로 가져올 수있는하는 우리의 형식을 통제 할 수없는 오히려 큰 파일을, 받고 있습니다. 이 파일은 이상 800 열을 포함 할 수 있으며, 종종 열 이름은 즉시 인식 할 수 없습니다.

그 결과, 우리는 800 VARCHAR 컬럼에 파일의 내용을 나타내는 큰 테이블이있다.

문제는 : 나는이 데이터를 찾고 있어요 어떤 특정 값을 알고 있지만, 나는 열을 포함 모르겠어요. 그리고 말했다 열을 찾기 위해 데이터를 째려 보는 것은도 효율적으로도 이상적이다.

내 질문은 : 어떤 값 N하여 테이블을 검색하고 그 값을 가지고있는 열 이름을 반환하는 모든 가능한 그것을인가? 내가 시도한 몇 가지 코드를 게시 싶지만,이 하나 어디서부터 시작 난 정말 모르겠어요 ... 또는 심지어 가능합니다.

예를 들면 :

A   B   C   D   E   F   G   H   I   J   K   L   M   N   ...
------------------------------------------------------------
'a' 'a' 'a' 'a' 'a' 'b' 'a' 'a' 'a' 'b' 'b' 'a' 'a' 'c' ...

내가 값 'B'에 대한이 테이블을 검색한다면, 나는 다음과 같은 결과를 돌아 가야 할 것입니다 :

Columns
---------
F
J
K

할 수이 같은가요?

해결법

  1. ==============================

    1.이 스크립트는 특정 문자열에 대한 모든 테이블과 모든 문자열 열을 검색합니다. 당신은 당신의 필요를 위해이 적응할 수 있습니다

    이 스크립트는 특정 문자열에 대한 모든 테이블과 모든 문자열 열을 검색합니다. 당신은 당신의 필요를 위해이 적응할 수 있습니다

    DECLARE @tableName sysname
    DECLARE @columnName sysname
    DECLARE @value varchar(100)
    DECLARE @sql varchar(2000)
    DECLARE @sqlPreamble varchar(100)
    
    SET @value = 'EDUQ4' -- *** Set this to the value you're searching for *** --
    
    SET @sqlPreamble = 'IF EXISTS (SELECT 1 FROM '
    
    DECLARE theTableCursor CURSOR FAST_FORWARD FOR 
        SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
         WHERE TABLE_SCHEMA = 'dbo' AND TABLE_TYPE = 'BASE TABLE' 
           AND TABLE_NAME NOT LIKE '%temp%' AND TABLE_NAME != 'dtproperties' AND TABLE_NAME != 'sysdiagrams'
         ORDER BY TABLE_NAME
    
    OPEN theTableCursor
    FETCH NEXT FROM theTableCursor INTO @tableName
    
    WHILE @@FETCH_STATUS = 0 -- spin through Table entries
    BEGIN
        DECLARE theColumnCursor CURSOR FAST_FORWARD FOR
            SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
             WHERE TABLE_NAME = @tableName AND (DATA_TYPE = 'nvarchar' OR DATA_TYPE = 'varchar')
             ORDER BY ORDINAL_POSITION
    
        OPEN theColumnCursor
        FETCH NEXT FROM theColumnCursor INTO @columnName
    
        WHILE @@FETCH_STATUS = 0 -- spin through Column entries
        BEGIN
            SET @sql = @tableName + ' WHERE ' + @columnName + ' LIKE ''' + @value + 
                       ''') PRINT ''Value found in Table: ' + @tableName + ', Column: ' +  @columnName + ''''
            EXEC (@sqlPreamble + @sql)
            FETCH NEXT FROM theColumnCursor INTO @columnName
        END
        CLOSE theColumnCursor
        DEALLOCATE theColumnCursor
    
        FETCH NEXT FROM theTableCursor INTO @tableName
    END
    CLOSE theTableCursor
    DEALLOCATE theTableCursor
    
  2. ==============================

    2.당신은 하나의 옵션은 SQL Server에서 약간의 창조적 사용하여 XML이 될 것입니다.

    당신은 하나의 옵션은 SQL Server에서 약간의 창조적 사용하여 XML이 될 것입니다.

    두 번째 크로스 적용을의 특정 값을 갖는 노드 신청 및 쿼리 크로스 사용하여 XML로 한 번에 행을 돌립니다.

    마지막으로 출력 노드 이름의 고유 한 목록입니다.

    declare @Value nvarchar(max)
    
    set @Value= 'b'
    
    select distinct T3.X.value('local-name(.)', 'nvarchar(128)') as ColName
    from YourTable as T1
      cross apply (select T1.* for xml path(''), type) as T2(X)
      cross apply T2.X.nodes('*[text() = sql:variable("@Value")]') as T3(X) 
    

    SQL 바이올린

  3. ==============================

    3.당신이 파일에 액세스 할 수있는 경우 정규식이해야 빨리 SQL에서 일반 검색을 수행하는 것보다 될 것입니다.

    당신이 파일에 액세스 할 수있는 경우 정규식이해야 빨리 SQL에서 일반 검색을 수행하는 것보다 될 것입니다.

    당신이 사용하는 SQL을 강요하는 경우 @ pmbAustin의 대답은 길을 가야하는 것입니다. 주의 할, 신속하게 실행되지 않습니다.

  4. from https://stackoverflow.com/questions/23481973/selecting-column-names-that-have-specified-value by cc-by-sa and MIT license