Я передаю имя динамического столбца на основе этого имени столбца, чтобы получить значение и ниже моей таблицы
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
Я прочитаю, если вы ответите, это поможет мне понять больше. @JeroenMostert
Зачем заставлять Джерона отвечать @mohdmazharkhan? Эти ссылки полезны и информативны, и вы не должны игнорировать их только потому, что они есть в комментариях. Комментарии на самом деле являются правильным местом для ответов только по ссылкам.
Увы, в качестве параметров нельзя передавать идентификаторы. Вам нужно использовать динамический 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;
Я предлагаю правильно указать здесь имя динамического столбца, иначе это просто проблема с внедрением, которая может произойти.
я не понимаю, где я могу получить вывод с одним значением, например 29. @Gordon Linoff
@ Ларну. . . Вы понизили ответ из-за этого?
все еще отображается ошибка: Msg 107, уровень 15, состояние 1, строка 2. Префикс столбца «t» не совпадает с именем таблицы или псевдонимом, используемым в запросе. @GordonLinoff
Несколько минут назад. Впрыск по-прежнему является слишком большой проблемой в отрасли, и ее необходимо решать. Поскольку ответ, на мой взгляд, опасен, через некоторое время я добавил отрицательный голос. Конечно, теперь, когда это решено, я изменил его на голосование.
Вы должны были быть в состоянии работать с этим сами mohdmazharkhan, перед *
был псевдоним, но у объекта его не было. Поскольку есть только один объект, я удалил псевдоним для вас здесь
Я получил свой ответ сверху, спасибо за ваши усилия для меня, но ваш ответ не помог мне в полной мере. @GordonLinoff
@ Ларну. . . Комментариев было бы достаточно. Спасибо за редактирование.
Я прокомментировал Гордона, и, может быть, через 30 минут инъекция все еще была там. В конце концов ваше внимание привлекло отрицательное голосование, а не комментарий; что, кажется, показывает, что понижение сделало свое дело. Обычно я просто комментирую, но если это проигнорировать, то отрицательный голос за опасный код будет гарантирован за то, что является опасным кодом (на мой взгляд). Но, как и я, если это решается, я всегда более чем рад изменить голосование (в конце концов, от избирателя зависит, как он использует свои голоса). :)
Я думаю, что вам на самом деле нужно следующее:
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';. @Ларну
Потому что строковый литерал — это nvarchar
. Например, в именах объектов используется тип данных sysname
, который является синонимом nvarchar(128)
. Обычно рекомендуется передавать nvarchar
в nvarchar
, поэтому я удостоверяюсь, что объявляю свои литеральные строки как одну. Это также означает, что если вы в конечном итоге столкнетесь с символом, отличным от ASCII, в своем коде, он не будет неявно изменен на '?'
.
Если у вас есть время, прочитайте эта статья о динамическом SQL и этот в условиях динамического поиска, если это то, для чего вы это используете. Динамический SQL — большая тема, но это потому, что люди часто используют его без необходимости, неправильно или способами, которые трудно заставить работать правильно. Простой ответ «вот как вы это делаете» пропустит все это.