我试图在列名称的某处找到包含单词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%'
答案 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