Как получить значение по имени динамического поля с помощью запроса sql select

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

Table_CandidateInfo

Id     Name        Age    City 

1      Mazhar      30     Gulbarga

20     Khan        29     Bidar

Пример1

Declare @ColumnName varchar(100), @Id int

set @ColumnName='Age' 
set @Id=20

select * from Table_CandidateInfo where ID=@Id and 

Я не могу передать ColumnName с запросом and, потому что имя столбца является динамическим кодом передачи. Мой вывод должен быть

29

Пример 2: если мой @ColumnName='City' и @Id=20, вывод должен быть таким, как показано ниже.

Bidar

Если у вас есть время, прочитайте эта статья о динамическом SQL и этот в условиях динамического поиска, если это то, для чего вы это используете. Динамический SQL — большая тема, но это потому, что люди часто используют его без необходимости, неправильно или способами, которые трудно заставить работать правильно. Простой ответ «вот как вы это делаете» пропустит все это.

Jeroen Mostert 27.05.2019 13:10

Я прочитаю, если вы ответите, это поможет мне понять больше. @JeroenMostert

mohd mazhar khan 27.05.2019 13:20

Зачем заставлять Джерона отвечать @mohdmazharkhan? Эти ссылки полезны и информативны, и вы не должны игнорировать их только потому, что они есть в комментариях. Комментарии на самом деле являются правильным местом для ответов только по ссылкам.

Larnu 27.05.2019 13:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
1 384
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Увы, в качестве параметров нельзя передавать идентификаторы. Вам нужно использовать динамический SQL:

declare @columnName varchar(100);
declare @Id int;

set @ColumnName = 'Age' ;
set @Id = 20;

declare @sql nvarchar(max);

set @sql = '
select *
from Table_CandidateInfo
where [columnName] = @Id';

select @sql = replace(@sql, '[columnName]', quotename(@columnName));

exec sp_executesql @sql,
                   N'@id int',
                   @id=@id;

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

Larnu 27.05.2019 12:53

я не понимаю, где я могу получить вывод с одним значением, например 29. @Gordon Linoff

mohd mazhar khan 27.05.2019 12:54

@ Ларну. . . Вы понизили ответ из-за этого?

Gordon Linoff 27.05.2019 13:21

все еще отображается ошибка: Msg 107, уровень 15, состояние 1, строка 2. Префикс столбца «t» не совпадает с именем таблицы или псевдонимом, используемым в запросе. @GordonLinoff

mohd mazhar khan 27.05.2019 13:24

Несколько минут назад. Впрыск по-прежнему является слишком большой проблемой в отрасли, и ее необходимо решать. Поскольку ответ, на мой взгляд, опасен, через некоторое время я добавил отрицательный голос. Конечно, теперь, когда это решено, я изменил его на голосование.

Larnu 27.05.2019 13:25

Вы должны были быть в состоянии работать с этим сами mohdmazharkhan, перед * был псевдоним, но у объекта его не было. Поскольку есть только один объект, я удалил псевдоним для вас здесь

Larnu 27.05.2019 13:27

Я получил свой ответ сверху, спасибо за ваши усилия для меня, но ваш ответ не помог мне в полной мере. @GordonLinoff

mohd mazhar khan 27.05.2019 13:32

@ Ларну. . . Комментариев было бы достаточно. Спасибо за редактирование.

Gordon Linoff 27.05.2019 17:34

Я прокомментировал Гордона, и, может быть, через 30 минут инъекция все еще была там. В конце концов ваше внимание привлекло отрицательное голосование, а не комментарий; что, кажется, показывает, что понижение сделало свое дело. Обычно я просто комментирую, но если это проигнорировать, то отрицательный голос за опасный код будет гарантирован за то, что является опасным кодом (на мой взгляд). Но, как и я, если это решается, я всегда более чем рад изменить голосование (в конце концов, от избирателя зависит, как он использует свои голоса). :)

Larnu 27.05.2019 17:57
Ответ принят как подходящий

Я думаю, что вам на самом деле нужно следующее:

DECLARE @ColumnName sysname, @Id int;
SET @Id = 29;
SET @ColumnName = N'Age';

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT ' + QUOTENAME(@ColumnName) + N' FROM dbo.Table_CandidateInfo WHERE Id = @Id;';
--PRINT @SQL; --Your debugging friend
EXEC sp_executesql @SQL, N'@Id int', @Id = @Id;

почему вы присоединили N к ColumnName, например N'Age';. @Ларну

mohd mazhar khan 27.05.2019 13:09

Потому что строковый литерал — это nvarchar. Например, в именах объектов используется тип данных sysname, который является синонимом nvarchar(128). Обычно рекомендуется передавать nvarchar в nvarchar, поэтому я удостоверяюсь, что объявляю свои литеральные строки как одну. Это также означает, что если вы в конечном итоге столкнетесь с символом, отличным от ASCII, в своем коде, он не будет неявно изменен на '?'.

Larnu 27.05.2019 13:09

Другие вопросы по теме