2013-05-10 8 views
0

У меня есть имя таблицы @Table_NameКак получить значение столбца, не зная имя столбца? SQL Server

У меня есть столбец значение, как @Value, но не имеют имя столбца (но есть в 1-м положении и может быть Seek_id или prov_id ... Я должен сравнить свое значение с этим id)

Как сравнить значение имени столбца таблицы?

Я хочу что-то вроде

SELECT * FROM @Table_Name 
WHERE Table.Column[1].Value = @Value 

, например @Table_Name = bb_match и @Value = 6

+2

Вы не можете это сделать - SQL Server нуждается в имени столбца - он не может использовать порядковое положение для ссылки на столбец в таблице –

+1

Возможно, вы сможете использовать некоторые динамические SQL-запросы sys.columns, чтобы найти первый столбец – Jaloopa

+0

, который вы можете использовать используйте поле ordinal_position в таблице INFORMATION_SCHEMA.COLUMNS, чтобы найти первый столбец данной таблицы. – Maximus

ответ

2

Возможное это будет полезно для вас -

Запрос:

IF OBJECT_ID (N'dbo.bb_match') IS NOT NULL 
    DROP TABLE dbo.bb_match 

CREATE TABLE dbo.bb_match (seek_id INT, prov_id INT) 

INSERT INTO dbo.bb_match (seek_id, prov_id) 
VALUES (6, 1), (2, 6) 

DECLARE 
     @ColumnID TINYINT 
    , @Value INT 
    , @TableName SYSNAME 
    , @SQL NVARCHAR(500) 

SELECT 
     @ColumnID = 1 
    , @Value = 6 
    , @TableName = 'dbo.bb_match' 

SELECT @SQL = 'SELECT * FROM ' + @TableName + ' WHERE [' + c.name + '] = ' + CAST(@Value AS NVARCHAR(MAX)) 
FROM sys.objects o WITH (NOWAIT) 
JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id] 
JOIN sys.columns c WITH (NOWAIT) ON o.[object_id] = c.[object_id] 
WHERE o.[type] = 'U' -- <-- only for tables columns 
    AND s.name + '.' + o.name = @TableName 
    AND c.column_id = @ColumnID 

PRINT @SQL 

EXEC sp_executesql @SQL 

Более короткий, но небезопасный (sys.columns содержит column_name для таблиц, представлений, процедур, ...):

SELECT @SQL = 'SELECT * FROM ' + @TableName + ' WHERE [' + c.name + '] = ' + CAST(@Value AS NVARCHAR(MAX)) 
FROM sys.columns c WITH (NOWAIT) 
WHERE c.[object_id] = OBJECT_ID(@TableName) 
    AND c.column_id = @ColumnID 

EXEC sys.sp_executesql @SQL

Выход:

SELECT * FROM dbo.bb_match WHERE [seek_id] = 6 

Результаты:

seek_id  prov_id 
----------- ----------- 
6   1 
+0

это не показывает запись/результат .... onlu, указав название столбца – user2369561

+0

Где вы указали позицию столбца. он хочет сравнить значение с первой колонкой. – Maximus

+0

У меня есть имя таблицы * table_Name и значение столбца * значение не имя столбца ... Как я могу искать в * table_Name Я знаю, что позиция столбца 1-го (1-й столбец в таблице) ..... – user2369561

0
declare @sql varchar(MAX) 
declare @tablename varchar(100) = 'MyTable' --add your table name here 
declare @value varchar(100) = 'SomeValue' -- add your desired value hree 

select @sql = 'SELECT * FROM ' + @tablename + ' WHERE ' 
+ name 
+ ' = ''' + @value + '''' 
from sys.columns where object_id = object_id(@tablename) and column_id = 1 

exec (@sql) 

Для этого есть три части. Сначала я объявляю три строки. @sql - это то, где я буду строить запрос, @tablename и @value - это таблица и значение поиска для поиска в/для. Я включил фиктивные значения MyTable и SomeValue, чтобы показать, что я говорю о

Далее я создаю заявление sql. Первая строка устанавливает строку как SELECT * FROM MyTable WHERE

Я затем добавить в имени столбца, выбрав имя из таблицы sys.columns SQL-серверной системы, фильтрации на первой колонке (column_id = 1) и имени таблицы

Следующий шаг для добавления значения, которое мы хотим найти в столбце.

Наконец, EXEC(@sql) интерпретирует строку как команду и запускает ее.

+0

спасибо jaloopa .... но получение ошибки Msg 137, уровень 15, состояние 1, строка 2 Должен объявить скалярную переменную «@sql». Msg 137, Level 15, State 2, Line 7 Должен объявить скалярную переменную «@sql». – user2369561

+0

выберите @sql = 'SELECT * FROM' + bb_match + 'где' + имя + '=' + 8 из sys.columns, где object_id = object_id ('TCONTROL') и column_id = 1 Exec (@sql) – user2369561

+0

очень срочно для решения этой проблемы – user2369561

Смежные вопросы