【问题标题】:How to get value by dynamic field Name using sql select query如何使用sql select查询通过动态字段名称获取值
【发布时间】:2019-10-12 22:36:52
【问题描述】:

我正在传递动态列名,基于该列名来获取值,并在我的表下方

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 

我无法通过 and 查询传递 ColumnName,因为列名是通过代码动态传递的。我的输出应该是

29

示例 2:如果我的 @ColumnName='City' 和 @Id=20 则输出应如下所示

Bidar

【问题讨论】:

  • 如果您有时间,请阅读this article on dynamic SQLthis one on dynamic search conditions,如果您正在使用它。动态 SQL 是一个很大的话题,但那是因为人们经常不必要地、错误地使用它,或者以难以正确执行的方式使用它。一个简单的“这就是你如何做”的答案将跳过所有这些。
  • 如果您回答,我会阅读,这将有助于我了解更多。 @JeroenMostert
  • 为什么要强迫 Jeroen 回答 @mohdmazharkhan?这些链接有用且信息丰富,您不应仅仅因为它们在 cmets 中而忽略它们。 cmets 实际上是仅链接答案的正确位置。

标签: sql sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

唉,您不能将标识符作为参数传递。您需要使用动态 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
  • @Larnu 。 . .您是否因此而否决了答案?
  • 仍然显示错误:Msg 107, Level 15, State 1, Line 2 列前缀“t”与查询中使用的表名或别名不匹配。 @GordonLinoff
  • 几分钟前。注射在行业中仍然是一个太大的问题,需要解决。由于我认为答案很危险,所以我确实在一段时间后添加了反对票。当然,既然已经解决了,我已经将其更改为赞成票。
【解决方案2】:

我认为你真正追求的是以下内容:

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';。 @Larnu
  • 因为字符串文字是nvarchar。例如,对象名称使用数据类型sysname,它是nvarchar(128) 的同义词。将nvarchar 传递给nvarchar 通常是个好主意,因此我确保将我的文字字符串声明为一个。这也意味着,如果您的代码中确实包含非 ASCII 字符,它不会隐式更改为 '?'
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多