Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
52 / 52 / 30
Регистрация: 24.02.2014
Сообщений: 229
1

Значения колонки в таблице, если имя колонки - переменная

03.11.2016, 04:22. Показов 5470. Ответов 6
Метки нет (Все метки)

Дана таблица tbTest. В таблице колонки: Field1, Field2, Field3,Field4, Field5,
Хранимая процедура получает имя колонки как @cField
Можно ли вывести значения по этому полю не прибегая к составлению запроса с помощью строковой переменной и exec()?

Вот такой конструкции хотелось бы избежать:
T-SQL
1
2
3
4
5
6
CREATE PROCEDURE spTest
@cField VARCHAR(20)
AS
DECLARE @s VARCHAR(100)
SET @s = 'SELECT ' + @cField + ' FROM tbTest'
EXEC(@s)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2016, 04:22
Ответы с готовыми решениями:

Можно ли использовать имя колонки как SQL параметр?
Недавно начал изучать SQL и дело дошло до того что надо в определённую колонку вставить некоторое...

[Проектирование БД] Колонки в таблице, которые можно достать запросами
Есть БД автобаза. Есть drivers CREATE TABLE drivers( id INT ...

Выборка данных из таблицы по колонке X исключая некоторые значения из колонки Y
Не могу разобраться с SQL запросом ввиду своей дилетантности. Условно - нужно выбрать записи из...

Ошибка Неверное имя колонки При добавлении колонки ТЗ
Народ, подскажите что не правильно, Выдет ошибку.Результат отчета помещаю в таблицу значений...

6
1529 / 1090 / 155
Регистрация: 23.07.2010
Сообщений: 6,124
03.11.2016, 09:21 2
какая-то странная автоматизация. Зачем?
сделай 5 вьюшек и не грей себе голову
0
шапоклякистка 8-го дня
3670 / 2230 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
04.11.2016, 10:15 3
SQL
1
2
3
4
5
6
7
8
SELECT (CASE
  WHEN @cField='Field1' THEN Field1 
  WHEN @cField='Field2' THEN Field2 
  WHEN @cField='Field3' THEN Field3 
  WHEN @cField='Field4' THEN Field4 
  WHEN @cField='Field5' THEN Field5 
  ELSE NULL END) AS MyColumn
FROM tbTest
0
52 / 52 / 30
Регистрация: 24.02.2014
Сообщений: 229
04.11.2016, 13:21  [ТС] 4
texnik-san, Спасибо.
Вижу по вашему ответу, что я не точно изложил задачу.
Я попробую её углУбить
Есть некая таблица. В ней динамически добавляются поля. Мы не знаем есть это поле в таблице в настоящее время или нет. Поэтому в процедуре мы не можем явно указывать имя колонки после оператора
SQL
1
THEN
Можно, конечно, получить список колонок таблицы и сравнить с ним, но как вставить её название в
SQL
1
SELECT
- наверно не решаемая задача.
0
3203 / 1941 / 689
Регистрация: 02.06.2013
Сообщений: 4,755
04.11.2016, 15:05 5
Цитата Сообщение от vaberg Посмотреть сообщение
Есть некая таблица. В ней динамически добавляются поля.
С большой долей уверенности можно сказать, что это ошибка проектирования.
А работать с такой таблицей без динамического SQL вообще очень странное желание.
Но вам повезло. Такой способ есть - column_set для sparse-столбцов:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use tempdb;
go
 
create table dbo.t (id int primary key, cs xml column_set for all_sparse_columns);
go
 
insert into dbo.t (id) values (1);
select
 a.id,
 b.n.value('c1[1]', 'int') as c1,
 b.n.value('c2[1]', 'varchar(50)') as c2
from
 dbo.t a outer apply
 a.cs.nodes('/') b(n);
go
 
alter table dbo.t add c1 int sparse;
go
 
insert into dbo.t (id, c1) values (2, 1);
select
 a.id,
 b.n.value('c1[1]', 'int') as c1,
 b.n.value('c2[1]', 'varchar(50)') as c2
from
 dbo.t a outer apply
 a.cs.nodes('/') b(n);
go
 
alter table dbo.t add c2 varchar(50) sparse;
go
 
insert into dbo.t (id, c1, c2) values (3, 5, 'test');
select
 a.id,
 b.n.value('c1[1]', 'int') as c1,
 b.n.value('c2[1]', 'varchar(50)') as c2
from
 dbo.t a outer apply
 a.cs.nodes('/') b(n);
go
 
drop table dbo.t;
go
0
1529 / 1090 / 155
Регистрация: 23.07.2010
Сообщений: 6,124
04.11.2016, 16:04 6
Цитата Сообщение от vaberg Посмотреть сообщение
Есть некая таблица. В ней динамически добавляются поля.
жесть. "что-то типа 1С" что-ле?
0
шапоклякистка 8-го дня
3670 / 2230 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
04.11.2016, 20:37 7
vaberg, я думаю, нужно сделать UNPIVOT вашей таблицы и к результату применить условие Where на имя столбца.

Текст запроса не напишу, т.к. о существовании UNPIVOT в MS SQL Server знаю в чисто теорически из учебников, а на практике он мне не был нужен и я его не освоила (не знаю синтаксис).

UNPIVOT превращает таблицу вида
ID Field1 Field2 Field3 Field4 Field5
1 'маша' 22 90 60 90
2 'даша' 17 105 72 110

в таблицу вида
ID ColumnName Value
1 'Field1' 'маша'
1 'Field2' '22'
1 'Field3' '90'
1 'Field4' '60'
1 'Field5' '90'
2 'Field1' 'даша'
2 'Field2' '17'
2 'Field3' '105 '
2 'Field4' '72'
2 'Field5' '110'

Добавлено через 2 минуты
Когда получите таблицу в таком виде, дальше элементарно:

SQL
1
2
3
SELECT ID, VALUE
FROM TT
WHERE ColumnName = 'НужноеВамИмя'
Добавлено через 4 часа 5 минут
===========
Решила таки вчитаться подробнее в синтаксис UNPIVOT. К сожалению, вынуждена отозвать свой совет: он не поможет. Синтаксис UNPIVOT требует явного перечисления тех столбцов, которые должны быть "развернуты" по ветикали.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2016, 20:37

Значения ячейки из определенной колонки в таблице Excel
Здравствуйте, хотел бы узнать каким образом можно получить значения ячейки из определенной колонки...

Как объединенные колонки в таблице разбить и поставить туда одинаковые значения?
Есть таблица в которой для некоторых полей используется colspan и rowspan. Но мне нужно, чтобы PHP...

Составить запрос, чтобы user_id из колонки comments сравнивался с id из колонки user_personal
У меня таблица comments с колонками user_id, name и page_id и есть таблица user_personal с...

Сreative 5.1 - при проигровании музыки работают 2 фронтальные колонки и саб, остальные колонки молчат
Здравствуйте Купил аудиосистему Сreative 5.1, поставил в комп карту SB Сreative audigy SE 5.1,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru