function set имя таблицы как параметр и получить имя столбца и имя таблицы из файла XML в sqlcommand c # [duplicate]

Звезда очень похожа на плюс, единственное отличие состоит в том, что, когда плюс соответствует 1 или более предшествующим символу / группе, начало соответствует 0 или более.

0
задан Zohar Peled 5 April 2016 в 07:17
поделиться

3 ответа

Посмотрите на пункт UNPIVOT - я не уверен, что он применим для вашего случая, но в некоторых случаях его можно использовать для запроса значения по имени столбца без динамического SQL:

create table t1 (
  a int,
  b int,
  c int
);

insert into t1 values
(1, 11, 111),
(2, 22, 222),
(3, 33, 333);

select a, col_name, col_value from t1
unpivot (col_value for col_name in (b, c)) as dt;

Результат:

| a | col_name | col_value |
|---|----------|-----------|
| 1 |        b |        11 |
| 1 |        c |       111 |
| 2 |        b |        22 |
| 2 |        c |       222 |
| 3 |        b |        33 |
| 3 |        c |       333 |

( SQL Fiddle )

Если вам нужно только значение в a в зависимости от какое-либо условие (динамически) либо b, либо c, вы можете построить на нем условие. Если вам нужны значения в столбце b или c, вы можете добавить ... WHERE col_name = ?. Если вам нужно больше столбцов, вам, вероятно, нужно будет отфильтровать значения столбцов в таблице без поворота, чем развернуть его снова, чтобы вернуть значения в столбцах.

3
ответ дан Jiri Tousek 16 August 2018 в 05:27
поделиться
  • 1
    можете ли вы показать пример того, как в этом случае помочь не может? – Zohar Peled 6 April 2016 в 05:34
  • 2
    Теперь я понимаю, что вы имеете в виду. хороший. – Zohar Peled 6 April 2016 в 08:30

Один из способов сделать это без использования динамического sql - использовать оператор CASE

Но это уродливо

SELECT EPV.EmployeeCode, case @RateOfEmployee  when 'RateOfEmployee' then RateOfEmployee
when 'X' then X 
..
end , case @RateOfEmployer  when 'RateOfEmployer' then RateOfEmployer
when 'Y' then Y
..
end 
FROM [HR_EmployeeProvisions] EPV

Вы должны проверить все столбцы в CASE.

5
ответ дан Pரதீப் 16 August 2018 в 05:27
поделиться
  • 1
    Я уже пробовал это, но для меня это не сработало. Также он делает запрос довольно длинным, добавляя операторы case для каждого столбца. Спасибо за ваш ответ. :) – Muhammad Bilal 5 April 2016 в 07:35
  • 2
    Можете ли вы объяснить, что не работает – Pரதீப் 5 April 2016 в 07:47
  • 3
    Я уже пробовал это, но я использую UNION ALL для нескольких других операторов, поэтому я не мог добавить это в свой сценарий. Я уже использую этот оператор CASE в моем запросе. :) – Muhammad Bilal 6 April 2016 в 12:10

Вы не можете параметризовать идентификаторы на сервере Sql, и я сомневаюсь, что это возможно в любой другой реляционной базе данных.

Ваш лучший выбор - использовать динамический Sql.

Обратите внимание, что динамический sql очень часто представляет угрозу безопасности, и вы должны защищать свой код от атак sql injection .

Я бы, вероятно, сделал бы что-то вроде этого:

Declare @Sql nvarchar(500)
Declare numberOfColumns int;

select @numberOfColumns = count(1)
from information_schema.columns
where table_name = 'HR_EmployeeProvisions'
and column_name IN(@RateOfEmployee, @RateOfEmployer)

if @numberOfColumns = 2 begin

Select @Sql = 'SELECT EmployeeCode, '+ QUOTENAME(@RateOfEmployee) +' ,'+ QUOTENAME(@RateOfEmployer) +
'FROM HR_EmployeeProvisions'

exec(@Sql)
end

Таким образом, вы убедитесь, что имена столбцов действительно существуют в таблице, а также использование QUOTENAME в качестве другого уровня безопасности.

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

5
ответ дан Zohar Peled 16 August 2018 в 05:27
поделиться
  • 1
    Это хороший трюк, чтобы избежать SQL Injection – Pரதீப் 5 April 2016 в 07:28
  • 2
    Спасибо за ваш ответ, но, к сожалению, я не могу это использовать. – Muhammad Bilal 5 April 2016 в 07:33
  • 3
    @Prdp на самом деле, я думаю, что ваш ответ одинаково хорош, когда не так много столбцов. Если в таблице много столбцов, это будет слишком громоздким. – Zohar Peled 5 April 2016 в 07:36
  • 4
    @MuhammadBilal, почему бы и нет? – Zohar Peled 5 April 2016 в 07:37
  • 5
    @MuhammadBilal - Начните объяснять свою проблему, а не просто сказать Я не могу использовать / Это не сработало – Pரதீப் 5 April 2016 в 08:02
Другие вопросы по тегам:

Похожие вопросы: