Ответ 1
Первый метод (протестирован)
Сначала получите список столбцов в строковой переменной, разделенных запятыми, а затем вы можете искать "foo" с помощью этой переменной с помощью IN
Проверьте хранимую процедуру ниже, которая сначала получает столбцы, а затем ищет строку:
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 [email protected]_NAME AND [email protected]_NAME)
BEGIN
PRINT 'Error : The table '''[email protected]_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-сервере вы можете получить идентификатор объекта таблицы, а затем используя этот идентификатор объекта, вы можете получить столбцы. В этом случае это будет следующим:
Шаг 1: Сначала получите идентификатор объекта таблицы
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 - это то, что вы получаете на первом этапе для вашей соответствующей таблицы.