像所有列一样应用而不指定所有列名?

Mic*_*l A 21 sql t-sql sql-server sql-server-2005 sql-server-2008

我发现自己处在一个我正在使用一个不熟悉的数据库的位置,每个表都有大量的列.我知道我正在寻找什么数据,但我不知道它所在的列是什么,需要使用like以便找到我需要的确切数据(并且必须为多组数据重复此任务) .

有没有办法像笛卡尔选择一样申请?

下面应该解释一下我想要做得更好一点(即使它在语法上是荒谬的):

select 
    *
from    
    a_table
where   
    * like '%x%'
Run Code Online (Sandbox Code Playgroud)

编辑:

请注意,我不打算在任何报告中使用cartesion选项 - 这里的目的是帮助我确定我需要在查询中添加的相关列,并帮助我熟悉数据库.

Ole*_*Dok 17

通常 - 它不可能以合理的方式(没有挖掘数据库元数据),但如果你知道列的名称,你可以使用这样的技巧:

select 
    YourTable.*
FROM YourTable
JOIN
( 
    select 
      id, 
      ISNULL(column1,'')+ISNULL(Column2,'')+...+ISNULL(ColumnN,'') concatenated
      FROM YourTable
) T ON T.Id = YourTable.Id
where   t.concatenated like '%x%'
Run Code Online (Sandbox Code Playgroud)

要么

如果搜索单词 - 使用FTS功能,因为上层查询是性能杀手


Ani*_*esh 7

有一个类似的讨论在这里.

没有直接的方法,你必须以这种方式做到这一点:

SELECT Name, Age, Description, Field1, Field2
FROM MyTable
WHERE Name LIKE 'Something%' OR Description LIKE 'Something%' OR Field1 LIKE 'Something%' OR Field2 LIKE 'Something%'
Run Code Online (Sandbox Code Playgroud)

该论坛中发布的解决方案之一就是这个,它使用动态SQL:

CREATE PROCEDURE TABLEVIEWSEARCH @TABLENAME        VARCHAR(60),@SEARCHSTRING VARCHAR(50)
-- EXEC TABLEVIEWSEARCH 'GMACT','demo'
-- EXEC TABLEVIEWSEARCH 'TABLEORVIEW','TEST'
AS
SET NOCOUNT ON
DECLARE @SQL      VARCHAR(500),
@COLUMNNAME       VARCHAR(60)

CREATE TABLE #RESULTS(TBLNAME VARCHAR(60),COLNAME VARCHAR(60),SQL VARCHAR(600))
SELECT 
  SYSOBJECTS.NAME AS TBLNAME,
  SYSCOLUMNS.NAME AS COLNAME,
  TYPE_NAME(SYSCOLUMNS.XTYPE) AS DATATYPE
  INTO #TMPCOLLECTION
    FROM SYSOBJECTS
      INNER JOIN SYSCOLUMNS ON SYSOBJECTS.ID=SYSCOLUMNS.ID
    WHERE SYSOBJECTS.NAME = @TABLENAME
    AND TYPE_NAME(SYSCOLUMNS.XTYPE) IN ('VARCHAR','NVARCHAR','CHAR','NCHAR')
    ORDER BY TBLNAME,COLNAME

DECLARE C1 CURSOR FOR 
SELECT COLNAME FROM #TMPCOLLECTION ORDER BY COLNAME
OPEN C1
FETCH NEXT FROM C1 INTO @COLUMNNAME
WHILE @@FETCH_STATUS <> -1
    BEGIN
        --SET @SQL = 'SELECT ''' + @TABLENAME + ''' AS TABLENAME,''' + @COLUMNNAME + ''' AS COLUMNNAME,* FROM ' + @TABLENAME + ' WHERE ' +  @COLUMNNAME + ' LIKE ''%' + @SEARCHSTRING + '%'''
        SET @SQL = 'IF EXISTS(SELECT * FROM [' + @TABLENAME + '] WHERE [' +  @COLUMNNAME + '] LIKE ''%' + @SEARCHSTRING + '%'') INSERT INTO #RESULTS(TBLNAME,COLNAME,SQL) VALUES(''' + @TABLENAME + ''',''' +  @COLUMNNAME + ''','' SELECT * FROM  [' + @TABLENAME + ']  WHERE [' + @COLUMNNAME + '] LIKE  ''''%' + @SEARCHSTRING + '%'''''') ;'
        PRINT @SQL
        EXEC (@SQL)
FETCH NEXT FROM C1 INTO @COLUMNNAME
    END
CLOSE C1
DEALLOCATE C1

SELECT * FROM #RESULTS

GO
CREATE PROCEDURE TABLEVIEWSEARCH2 @TABLENAME        VARCHAR(60),@SEARCHSTRING VARCHAR(50)
-- EXEC TABLEVIEWSEARCH2 'GMACT','SOURCE'
-- EXEC TABLEVIEWSEARCH2 'TABLEORVIEW','TEST'
AS
BEGIN
SET NOCOUNT ON
DECLARE @FINALSQL      VARCHAR(MAX),
@COLUMNNAMES       VARCHAR(MAX)
SET @FINALSQL = 'SELECT * FROM [' + @TABLENAME + '] WHERE 1 = 2 '
SELECT 
    @FINALSQL = @FINALSQL + ' OR [' + SYSCOLUMNS.NAME + '] LIKE ''%' + @SEARCHSTRING + '%'' '

    FROM SYSCOLUMNS 
    WHERE OBJECT_NAME(id) = @TABLENAME
    AND TYPE_NAME(SYSCOLUMNS.XTYPE) IN ('VARCHAR','NVARCHAR','CHAR','NCHAR')
    ORDER BY COLID

PRINT @FINALSQL
EXEC(@FINALSQL)
END --PROC
Run Code Online (Sandbox Code Playgroud)

我在包含以下数据的employee表上测试了这个:

在此输入图像描述

运行以下语句

EXEC TABLEVIEWSEARCH2 'employee','2'

导致:

2   1   eng2
4   2   dev2
7   3   sup2
9   4   qa2
Run Code Online (Sandbox Code Playgroud)

我想我会提供更多这方面的例子,因为上面的Emp表只有一个字段用于搜索数据.

这是来自todo数据库的任务表: 在此输入图像描述

搜索短语en:(突出显示数据匹配的单元格)

EXEC TABLEVIEWSEARCH2 'task','en'

在此输入图像描述