[英]SQL Server SELECT where any column contains 'x'
使用 SQL Server 2008,假設我有一個名為testing
的表,其中包含 80 列,我想找到一個名為foo
的值。
我可以:
SELECT *
FROM testing
WHERE COLNAME = 'foo'
是否可以查詢所有 80 列並返回 80 列中任何一列中包含foo
的所有結果?
提前致謝。
您可以in
:
SELECT *
FROM testing
WHERE 'foo' in (col1, col2, col3, . . . );
第一種方法(已測試)首先獲取以逗號分隔的字符串變量中的列列表,然后您可以使用IN
使用該變量搜索 'foo'
檢查下面的存儲過程,它首先獲取列然后搜索字符串:
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 );
第二種方法在 sql server 中,您可以獲得表的對象 id,然后使用該對象 id 可以獲取列。 在這種情況下,它將如下所示:
步驟 1:首先獲取表的對象 ID
select * from sys.tables order by name
第 2 步:現在獲取表格的列並在其中搜索:
select * from testing where 'foo' in (select name from sys.columns where object_id =1977058079)
注意:object_id 是您在第一步中為相關表獲取的內容
我認為這是最好的方法之一
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%'
您可以使用 in 並且可以動態獲取列名並將它們傳遞給IN
子句,方法是創建 sql 字符串並使用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
我從ubaid ashraf 的回答中得到了這個想法,但讓它真正起作用。 只需在此處更改 MyTableName:
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,'')
您可以根據需要調整它並從 where 列('t.name !='int' AND t.name !='bit' 等部分)添加或刪除條件,例如添加 't.name != ' uniqueidentifier'' 以避免Conversion failed when converting the varchar value 'myvalue' to data type int
類型錯誤Conversion failed when converting the varchar value 'myvalue' to data type int
。
然后將結果復制粘貼到此查詢中(否則它不起作用):
SELECT * from MyTableName where 'foo' in (COPY PASTE PREVIOUS QUERY RESULT INTO HERE)
--Obtain object_id
SELECT object_id FROM sys.tables WHERE name = <your_table>
--look for desired value in specified columns using below syntax
SELECT * FROM <your_table> WHERE <VALUE_YOU_SEARCH_FOR> in
(SELECT name FROM sys.tables WHERE object_id = <your_table_object_id>
and name like '<if_you_have_multiple_columns_with_same_name_pattern>')
我已經使用BornToCode 的答案,這個腳本生成查詢以在數據庫的任何視圖(可以是表)的所有 varchar 類型的列中查找值:
DECLARE @id INT
declare @name nvarchar(30)
DECLARE @getid CURSOR
declare @value nvarchar(30)
set @value = 'x'
SET @getid = CURSOR FOR
SELECT object_id,name
FROM sys.views
OPEN @getid
FETCH NEXT
FROM @getid INTO @id, @name
WHILE @@FETCH_STATUS = 0
BEGIN
---------
SELECT 'SELECT * from ' + @name + ' where ''' + @value + ''' in (' +
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 = 'varchar'-- AND t.name != 'bit' AND t.name !='date' AND t.name !='datetime'
AND object_id =(SELECT object_id FROM sys.views WHERE name=@name)
FOR XML PATH('')),1,2,'')
+ ')' as 'query'
------
FETCH NEXT
FROM @getid INTO @id, @name
END
CLOSE @getid
DEALLOCATE @getid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.