SQL Server SELECT where any column contains 'x'

后端 未结 5 1971
無奈伤痛
無奈伤痛 2020-12-01 05:22

Using SQL Server 2008, say I have a table called testing with 80 columns and I want to find a value called foo.

I can do:

S         


        
相关标签:
5条回答
  • 2020-12-01 05:57

    I took the idea from ubaid ashraf's answer, but made it actually work. Just change MyTableName here:

    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,'')
    

    You could tweak it to your needs and add or remove conditions from the where column (the 't.name != 'int' AND t.name != 'bit' etc. part), e.g. add 't.name != 'uniqueidentifier'' to avoid getting Conversion failed when converting the varchar value 'myvalue' to data type int type of errors..

    Then copy paste the result into this query (otherwise it didn't work):

    SELECT * from MyTableName where 'foo' in (COPY PASTE PREVIOUS QUERY RESULT INTO HERE)
    
    0 讨论(0)
  • 2020-12-01 06:01

    I think this is one of the best ways of doing it

    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%'
    
    0 讨论(0)
  • 2020-12-01 06:04

    You can use in:

    SELECT *
    FROM testing 
    WHERE 'foo' in (col1, col2, col3, . . . );
    
    0 讨论(0)
  • 2020-12-01 06:12

    First Method(Tested) First get list of columns in string variable separated by commas and then you can search 'foo' using that variable by use of IN

    Check stored procedure below which first gets columns and then searches for string:

    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 );
    

    2nd Method In sql server you can get object id of table then using that object id you can fetch columns. In that case it will be as below:

    Step 1: First get Object Id of table

    select * from sys.tables order by name    
    

    Step 2: Now get columns of your table and search in it:

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

    Note: object_id is what you get fetch in first step for you relevant table

    0 讨论(0)
  • 2020-12-01 06:12

    You can use in and you can get the column names dynamically and pass them to IN clause by making sql string and executing it using execute sp_executesql.

    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
    
    0 讨论(0)
提交回复
热议问题