尝试运行查询
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。
答案 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