2015-10-08 31 views
-1

試圖運行查詢SQL查詢從另一臺SQL Server 2012的

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

你確定這是整個查詢?我的意思是,除了您執行笛卡爾產品的事實之外,我沒有在您的查詢中的任何位置看到CustomersID'列 – Lamak

+0

它具有TablesList.TableName +'ID'的意圖給了我可以用來等同的CustomersID字符串到10 –

回答

0

我的猜測是,Tablelist.TableName價值是客戶,所以當你+「ID」它會導致「客戶ID」。 'CustomerID'是返回的VALUE值,而不是字段名稱,它與10進行比較。

因此,當sqlserver嘗試將'CustomerID'轉換爲10時,您會收到一條錯誤消息,告訴您它不是整數值。

據我知道你不能從一個字段值獲得一個「字段名」直接低谷SQL,對於你需要創建一個存儲過程或某種編程語言來構建動態查詢

0

TablesList.TableName+'ID'生成字符串'CustomersID'。你得到的錯誤,因爲你的比較實際上是由這樣的:

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

什麼,我認爲你想達到要求dynamic SQL

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然後運行該語句。

0

使用的毗連:

SELECT * FROM客戶,TablesList其中CONCAT( 'TablesList.TableName', 'ID')= 10和tableslist.tableid = 123