查找表的信息,其中部分列匹配char变量

时间:2014-12-30 20:06:03

标签: sql sql-server

我试图在列名称的某处找到包含单词date的列的任何表格。

我的所有查询都是全部或全部:它们返回数据库中的所有表,或根本没有结果。

当我在没有变量的情况下运行查询时,它会起作用,如此处所示。

select  *
from MyDB.INFORMATION_SCHEMA.COLUMNS
where column_name like '%date%'

但是,我无法通过使用变量来使其工作。

declare @temp varchar = 'date'
select*
from MyDB.INFORMATION_SCHEMA.COLUMNS
where column_name like '%' + @temp + '%'

我之所以这样做是因为我需要在多个数据库(例如下面)上运行它,我必须多次执行此操作(不仅仅是date ),我希望这个过程更顺利。

    select  *
    from MyDB1.INFORMATION_SCHEMA.COLUMNS
    where column_name like '%date%'
union all
    select  *
    from MyDB2.INFORMATION_SCHEMA.COLUMNS
    where column_name like '%date%'
union all
    select  *
    from MyDB3.INFORMATION_SCHEMA.COLUMNS
    where column_name like '%date%'

3 个答案:

答案 0 :(得分:1)

您可以使用您喜欢的列信息来源,但您遇到的问题是因为您的变量声明。

声明@temp varchar ='date'相当于 声明@temp varchar(1)='date'所以 select @temp返回'd',这样你就可以得到任何包含'd'

的列

当您声明变量时,请确保其长度足以存储您要搜索的最长字符串。 Jason的答案也会起作用,但这是因为变量声明不是数据的来源。

答案 1 :(得分:1)

使用游标进行一次查询以循环遍历服务器上的所有数据库,或者可以显式循环访问某个数据库

查询

DECLARE @DB_Name SYSNAME;
DECLARE @Sql NVARCHAR(MAX)= '';


DECLARE @cur CURSOR;

SET @Cur = CURSOR FOR
SELECT name 
FROM sys.sysdatabases
--WHERE name IN ('DBName1', 'DBName2', 'DBName3');  --<-- uncomment this line and 
                                                      -- specify the database names
OPEN @cur

FETCH NEXT FROM @Cur INTO @DB_Name 

WHILE (@@FETCH_STATUS = 0)
BEGIN
   SET @Sql = N'
SELECT t.name 
      ,c.name 
FROM '+ QUOTENAME(@DB_Name) + '.sys.tables  t 
INNER JOIN ' + QUOTENAME(@DB_Name) + '.sys.columns c ON c.object_id = t.object_id
WHERE t.name LIKE ''%test%'''

    EXEC(@Sql)

   FETCH NEXT FROM @Cur INTO @DB_Name 
END

CLOSE @cur
DEALLOCATE @cur

答案 2 :(得分:0)

我猜问题是你的变量声明部分。

默认情况下,在SQLServer中将使用数据类型 VARCHAR 声明的任何变量视为 VARCHAR(1)

declare @temp varchar = 'date'
print @temp --d 

因此,请尝试将变量声明为 VARCHAR(4)

declare @temp varchar(4) = 'date'
print @temp --date