2011-05-04 95 views
2

我有一個簡單的SQL表,它有兩列Name和Ids都是varchar(10);現在我有像表中的價值('測試','1,2,3')。我們有另一張表來獲得員工的全部詳細信息,但tblEmployee中的Ids列是int。下面的SQL將給出錯誤,將varchar轉換爲int SQl服務器2005

select * from tblEmployee where Ids in(從tblNameId中選擇ID,其中name ='Test');

錯誤無法將1,2,3轉換爲int。他們是一種將所有值轉換爲int或其他解決方法的方法。

謝謝。

回答

1

使用下面的函數來分割文本

CREATE FUNCTION dbo.Split(@String varchar(8000))  
returns @temptable TABLE (items int)  
as  
begin  
    declare @idx int  
    declare @slice varchar(8000)  

    select @idx = 1  
     if len(@String)<1 or @String is null return  

    while @idx!= 0  
    begin  
     set @idx = charindex(',',@String)  
     if @idx!=0  
      set @slice = left(@String,@idx - 1)  
     else  
      set @slice = @String  

     if(len(@slice)>0) 
      insert into @temptable(Items) values(CONVERT(INT, @slice))  

     set @String = right(@String,len(@String) - @idx)  
     if len(@String) = 0 break  
    end 
return  
end 

然後

Select * from tblEmployee where Ids in dbo.Split(Select Ids from tblNameId where name='Test'); 

(從本網站改編:http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

1

看起來你實際上有一個逗號分隔的列表整數。你可以查詢,如:

select * 
from tblEmployee e 
join tblNameId ni 
on  ',' + ni.Ids + ',' like '%,' + cast(e.Ids as varchar(12)) + ',%' 

一個清潔的設計將正常化tblNameId表,其中一行對每個員工的ID。

+0

喜歡可以很慢取決於數據 – ariel 2011-05-04 08:56:32