从另一个表SQL Server 2012获取列名的SQL查询

时间:2015-10-08 16:37:00

标签: sql sql-server

尝试运行查询

select * from customers, TablesList where TablesList.TableName+'ID' =
10 and tableslist.tableid= 123

其中列名从另一个表中获取。我收到以下错误

Msg 245, Level 16, State 1, Line 1 Conversion failed when converting
the nvarchar value 'CustomersID' to data type int.

我知道我可以做Select * from customers where customersID = 10

之类的事情

但是尝试从另一个表动态创建CustomersID列名。它的意图是TablesList.TableName+'ID'给我CustomersID字符串,我可以用来等同于10。

4 个答案:

答案 0 :(得分:0)

我的猜测是Tablelist.TableName的值是Customer,因此当你执行+'ID'时会产生'CustomerID'。 'CustomerID'是返回的VALUE,而不是与10进行比较的FIELD NAME。

因此,当sqlserver尝试将'CustomerID'转换为10时,会收到一条错误消息,告诉您它不是整数值。

据我所知,你不能通过SQL直接从字段值中获取“字段名称”,因为你需要创建一个存储过程或某种编程语言来动态构建查询

答案 1 :(得分:0)

TablesList.TableName+'ID'生成字符串'CustomersID'。您收到错误是因为您的比较实际上是这样的:

'CustomersID' = 10 -- The comparison NVARCHAR = INT produces the error

我认为你想要实现的目标需要dynamic SQL

答案 2 :(得分:0)

你所拥有的问题是你的where子句检查值'CustomerID'是否等于10.它不是(也不能)在该上下文中使用该字符串作为列名。您需要使用dynamic sql

动态SQL是您构建包含您想要运行的SQL的字符串的地方。举个例子,你可以这样做:

declare @sql varchar(max)
set @sql = 'select * from customers where ' + (select top 1 TableName from TableList where tableId = 123) + 'ID = 10'

EXEC(@sql)

这会将@sql变量设置为select * from customers where customerID = 10,然后运行该语句。

答案 3 :(得分:0)

使用Concat:

select * from customers,TablesList where Concat(' TablesList.TableName',' ID')= 10和tableslist.tableid = 123