복붙노트

[SQL] 모든 열은 'X'가 들어 SQL 서버 SELECT

SQL

모든 열은 'X'가 들어 SQL 서버 SELECT

SQL Server 2008을 사용하여, 나는라는 테이블에 80 개 컬럼으로 테스트하고 난 푸라는 값을 찾으려면 말한다.

내가 할 수있는:

SELECT * 
FROM testing 
WHERE COLNAME = 'foo'

나는 모든 80 열을 조회하고 foo는이 80 열 중 하나에 포함되는 모든 결과를 반환 할 수 있습니다 것이 가능?

미리 감사드립니다.

해결법

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

    1.첫 번째 방법 (테스트) IN을 사용하여 해당 변수를 사용하여 문자열 변수의 열 먼저 가져 오기 목록은 쉼표로 구분 한 다음은 '갑'을 검색 할 수 있습니다

    첫 번째 방법 (테스트) IN을 사용하여 해당 변수를 사용하여 문자열 변수의 열 먼저 가져 오기 목록은 쉼표로 구분 한 다음은 '갑'을 검색 할 수 있습니다

    첫 번째 문자열에 대한 열 및 다음 검색을 얻을 수있는 아래의 저장 프로 시저를 확인 :

    DECLARE @TABLE_NAME VARCHAR(128)
    DECLARE @SCHEMA_NAME VARCHAR(128)
    
    -----------------------------------------------------------------------
    
    -- Set up the name of the table here :
    SET @TABLE_NAME = 'testing'
    -- Set up the name of the schema here, or just leave set to 'dbo' :
    SET @SCHEMA_NAME = 'dbo'
    
    -----------------------------------------------------------------------
    
    DECLARE @vvc_ColumnName VARCHAR(128)
    DECLARE @vvc_ColumnList VARCHAR(MAX)
    
    IF @SCHEMA_NAME =''
      BEGIN
      PRINT 'Error : No schema defined!'
      RETURN
      END
    
    IF NOT EXISTS (SELECT * FROM sys.tables T JOIN sys.schemas S
          ON T.schema_id=S.schema_id
          WHERE T.Name=@TABLE_NAME AND S.name=@SCHEMA_NAME)
      BEGIN
      PRINT 'Error : The table '''+@TABLE_NAME+''' in schema '''+
          @SCHEMA_NAME+''' does not exist in this database!' 
      RETURN
     END
    
    DECLARE TableCursor CURSOR FAST_FORWARD FOR
    SELECT   CASE WHEN PATINDEX('% %',C.name) > 0 
         THEN '['+ C.name +']' 
         ELSE C.name 
         END
    FROM     sys.columns C
    JOIN     sys.tables T
    ON       C.object_id  = T.object_id
    JOIN     sys.schemas S
    ON       S.schema_id  = T.schema_id
    WHERE    T.name    = @TABLE_NAME
    AND      S.name    = @SCHEMA_NAME
    ORDER BY column_id
    
    
    SET @vvc_ColumnList=''
    
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @vvc_ColumnName
    
    WHILE @@FETCH_STATUS=0
      BEGIN
       SET @vvc_ColumnList = @vvc_ColumnList + @vvc_ColumnName
    
        -- get the details of the next column
       FETCH NEXT FROM TableCursor INTO @vvc_ColumnName
    
      -- add a comma if we are not at the end of the row
       IF @@FETCH_STATUS=0
        SET @vvc_ColumnList = @vvc_ColumnList + ','
       END
    
     CLOSE TableCursor
     DEALLOCATE TableCursor
    
    -- Now search for `foo`
    
    
    SELECT *
    FROM testing 
    WHERE 'foo' in (@vvc_ColumnList );
    

    두번째 방법 SQL 서버에서는 다음 열을 가져올 수있는 객체의 ID를 사용하여 테이블의 객체 ID를 얻을 수 있습니다. 이 경우는 다음과 같이 될 것입니다 :

    1 단계 : 테이블의 첫 번째 GET 개체 ID

    select * from sys.tables order by name    
    

    2 단계 : 이제 테이블의 열을 얻고 그것에서 검색 :

     select * from testing where 'foo' in (select name from sys.columns  where  object_id =1977058079)
    

    참고 : OBJECT_ID는 중요한 테이블에 대한 첫 번째 단계에서 가져 오기 무엇을 얻을

  2. ==============================

    2.당신은에서 사용할 수 있습니다 :

    당신은에서 사용할 수 있습니다 :

    SELECT *
    FROM testing 
    WHERE 'foo' in (col1, col2, col3, . . . );
    
  3. ==============================

    3.나는이 그것을하는 가장 좋은 방법 중 하나라고 생각

    나는이 그것을하는 가장 좋은 방법 중 하나라고 생각

    SELECT * FROM sys.columns  a
    inner join 
    (
    SELECT object_id
    FROM sys.tables 
    where 
    type='U'--user table
    and name like 'testing' 
    ) b on a.object_id=b.object_id
    WHERE a.name like '%foo%'
    
  4. ==============================

    4.당신은에서 사용할 수 있으며 동적으로 열 이름을 얻고 SQL 문자열을하고 sp_executesql을 실행 사용하여 실행하여 IN 절에 전달할 수 있습니다.

    당신은에서 사용할 수 있으며 동적으로 열 이름을 얻고 SQL 문자열을하고 sp_executesql을 실행 사용하여 실행하여 IN 절에 전달할 수 있습니다.

    declare @sql nvarchar(2100)
    declare @cols nvarchar(2000)
    declare @toSearch nvarchar(200)
    declare @tableName nvarchar(200)
    set @tableName = 'tbltemp'
    set @toSearch = '5' 
    set @cols =(
     SELECT LEFT(column_name, LEN(column_name) - 1)
    FROM (
        SELECT column_name + ', '
        FROM INFORMATION_SCHEMA.COLUMNS where table_name = @tableName
        FOR XML PATH ('')
      ) c (column_name )
    )
    set @sql = 'select * from tbltemp where '''+ @toSearch + '''  in (' + @cols + ')';  
    execute sp_executesql @sql
    
  5. ==============================

    5.나는 ubaid 라프의 대답에서 아이디어를했다,하지만 실제로 작업을했다. 그냥 여기 MyTableName을 변경 :

    나는 ubaid 라프의 대답에서 아이디어를했다,하지만 실제로 작업을했다. 그냥 여기 MyTableName을 변경 :

    SELECT STUFF((
        SELECT ', ' + c.name 
        FROM sys.columns  c
        JOIN sys.types AS t ON c.user_type_id=t.user_type_id
        WHERE t.name != 'int'  AND t.name != 'bit' AND t.name !='date' AND t.name !='datetime'
            AND object_id =(SELECT object_id FROM sys.tables WHERE name='MyTableName')
        FOR XML PATH('')),1,2,'')
    

    당신은 당신의 필요에 맞게 조정할와 (INT 'AND t.name! ='비트 '등 일부'! = t.name을 ')이 경우 열에서 추가하거나 제거 조건 수, 예를 들어, 't.name를! ='추가 고유 식별자 '오류의 int 데이터 형식 유형에 myvalue' '는 VARCHAR 값을 변환 할 때 변환이 실패 입지 않도록'..

    그런 다음 (그렇지 않으면 작동하지 않았다)이 쿼리에 결과를 붙여 복사 :

    SELECT * from MyTableName where 'foo' in (COPY PASTE PREVIOUS QUERY RESULT INTO HERE)
    
  6. from https://stackoverflow.com/questions/28717868/sql-server-select-where-any-column-contains-x by cc-by-sa and MIT license