2011-05-04 80 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

相关问题