如何在SQL Server中搜索表的所有列?
如何在SQL Server中搜索表的所有列?
SELECT ...
FROM yourtable
WHERE 'val' IN (field1, field2, field3, field4, ...)
如果你要寻找完全匹配的字段,那么可以直接进行查找。但如果你要寻找子字符串的匹配,则需要采用较为繁琐的方法:
WHERE field1 LIKE '%val%' or field2 LIKE '%val%' etc....
你甚至可以这样做。动态创建查询。
CREATE PROC SearchSpecificTable
(
@SearchStr nvarchar(100)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @columnName NVARCHAR(100), @SearchStr2 nvarchar(128)
DECLARE @tableName NVARCHAR(100) = 'TARGET_TABLE'
DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM ' + @tableName +' WHERE '
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
DECLARE columns CURSOR FOR
SELECT sys.columns.name FROM sys.tables
INNER JOIN sys.columns ON sys.columns.object_id = sys.tables.object_id
WHERE sys.tables.name = @tableName
OPEN columns
FETCH NEXT FROM columns
INTO @columnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + @columnName + ' LIKE ' + @SearchStr2 + ' OR '
FETCH NEXT FROM columns
INTO @columnName
END
CLOSE columns;
DEALLOCATE columns;
SET @sql = LEFT(RTRIM(@sql), LEN(@sql) - 2) -- remove last OR
EXEC(@sql)
END
当然,您可以将 DECLARE @tableName NVARCHAR(100) = 'TARGET_TABLE'
更改为存储过程的参数。
您可以使用以下方式调用它:
EXEC SearchSpecificTable @SearchStr = 'needle_to_find';
我认为这件事没有捷径,你必须指定要搜索的列的列表。如果你发现自己经常需要这样做,那么你可能可以改进数据库设计。
SELECT *
FROM MyTable
WHERE Col1 LIKE '%foo%' OR
Col2 LIKE '%foo%' OR
Col3 LIKE '%foo%' OR
Col4 LIKE '%foo%' OR
Col5 LIKE '%foo%' OR
Col6 LIKE '%foo%'
我不能为此负责,但我发现这样做非常有效。您可以将其他数据类型添加到 WHERE 子句中以包含其他类型,如果需要限制搜索,则还可以添加 JOIN 中的模式名称(如下所述)。
DECLARE @SQL VARCHAR(MAX)
DECLARE @SearchString VARCHAR(100)
SET @SQL=''
-- ------------------------------------------
-- Enter the string to be searched for here :
SET @SearchString=''
-- ------------------------------------------
SELECT @SQL = @SQL + 'SELECT CONVERT(VARCHAR(MAX),COUNT(*)) + '' matches in column ''+'''
+ C.name + '''+'' on table '' + ''' + SC.name + '.' + T.name +
''' [Matches for '''+@SearchString+''':] FROM ' +
QUOTENAME(SC.name) + '.' + QUOTENAME(T.name) + ' WHERE ' + QUOTENAME(C.name) +
' LIKE ''%' + @SearchString +
'%'' HAVING COUNT(*)>0 UNION ALL ' +CHAR(13) + CHAR(10)
FROM sys.columns C
JOIN sys.tables T ON C.object_id=T.object_id
JOIN sys.schemas SC ON SC.schema_id=T.schema_id -- AND SC.name = ''
JOIN sys.types ST ON C.user_type_id=ST.user_type_id
JOIN sys.types SYST ON ST.system_type_id=SYST.user_type_id
AND ST.system_type_id=SYST.system_type_id
WHERE SYST.name IN ('varchar','nvarchar','text','ntext','char','nchar')
ORDER BY T.name, C.name
-- Strip off the last UNION ALL
IF LEN(@SQL)>12
SELECT @SQL=LEFT(@SQL,LEN(@SQL)- 12)
EXEC(@SQL)
--PRINT @SQL
我之前在一个项目中就做过这件事。在SQL中搜索所有列的最佳方法是在表格中创建一个新列,并将每列的文本/数据粘贴到其中,如下所示:
表格:
|---------------------------------------------------|
| column1 | column2 | search_column |
|---------------------------------------------------|
| fooxxxxx | barxxxx | fooxxxxx barxxxx |
----------------------------------------------------|
SELECT search_column FROM table1 LIKE %关键词%
这样做可以快速实现目标,而且不需要编写大量的SQL代码。这种查询方式也更快速。唯一的缺点是当更新和创建表格时,必须重新构造search_column。
WHERE LIKE '关键词%'或LIKE '%关键词'或LIKE '%关键词%'
来概括查询。 - BBQ SingularSELECT Firstname, Name, Place
FROM person NATURAL JOIN
(SELECT PersonID, CONCAT(Firstname, ' ', Name, ' ', Cellphone, ' ',
Email, ' ', Place) search_string FROM person) as all_in_one
WHERE search_string LIKE '%Hans%' AND search_string LIKE '%Muster%'
如果您正在使用来自另一种语言(如PHP)的SQL,您可以使用循环添加WHERE后面的部分。以下是一个来自PHP的示例:
$q = $_GET['q'];
$words = explode(" ", $q);
foreach($words as $word){
if(is_null($search_query)){
$search_query = "search_string LIKE '%$word%'";
}else{
$search_query .= " AND search_string LIKE '%$word%'";
}
}