2015-09-01 151 views
-1

我只想运行一个查询,但经过一段时间后,它给了我转换失败错误。下面是我试图运行查询:在SQL中将varchar值转换为int错误时转换失败

“转换VARCHAR值时,转换失败......为int”

Declare @ID varchar(max) 
set @ID = '33, 691, 688, 58, 42, 3' 


select listing_id, rpt_id, name_en, phone 
from tsgb_extract_110107 
where rpt_id in (@ID) 

我传递rpt_id的查询作为一个varchar变量。有什么想法吗?

+0

必须有'rpt_id'的值不能转换为'VARCHAR'。 –

+0

列rpt_id具有类型INT。 – Tom

+0

好的。所以你的意思是说你正在传递'rpt_cat_id',像这样:''3300718,3305691,3234688,3358162,3423680,3406570,3368217,3363510'? –

回答

0

比较VARCHAR VARCHAR能够解决您的问题,假设tsgb_extract_110107是一个表

select listing_id, rpt_id, name_en, phone 
from tsgb_extract_110107 
where rpt_id in ('3300718', 
'3305691', 
'3234688', 
'3358162', 
'3423680', 
'3406570', 
'3368217', 
'3363510', 
) 

编辑

可以将@ID分成表中,然后使用连接

Declare @ID varchar(max) 
set @ID = '33, 691, 688, 58, 42, 3' 


DECLARE @xml as xml 
SET @xml = cast(('<X>'+replace(@ID, ',' ,'</X><X>')+'</X>') as xml) 

;WITH criteria AS 
(
    SELECT LTRIM(N.value('.', 'varchar(10)')) as value FROM @xml.nodes('X') as T(N) 
) 
select listing_id, rpt_id, name_en, phone 
from tsgb_extract_110107 INNER JOIN criteria ON rpt_id = criteria.value 
+0

我将rpt_id作为参数传递给Query。 – Tom

+0

@Tom,怎么样?你可以在你的代码中显示它吗? –

+0

@Tom你不能以这种方式使用'in' – Eric

0

试试这种方式

select listing_id, rpt_id, name_en, phone 
from tsgb_extract_110107 
where ISNUMERIC(rpt_id) And Convert(numeric(18,0),rpt_id) in (3300718, 
3305691, 
3234688, 
3358162, 
3423680, 
3406570, 
3368217, 
3363510, 
) 
0

首先,您需要有一个字符串拆分器。下面是阿龙贝特朗的article采取一个:

CREATE FUNCTION [dbo].[SplitStrings_XML] 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    ( 
     SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)') 
     FROM 
     ( 
     SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') 
      + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i) 
    ); 

然后,使用该功能在您的WHERE条款:

select 
    listing_id, rpt_id, name_en, phone 
from tsgb_extract_110107 
where 
    rpt_id in (
     select cast(rtrim(ltrim(value)) as int) from dbo.SplitStrings_XML(@ID) 
    ) 
0

以下查询

Declare @ID varchar(max) 
set @ID = '33, 691, 688, 58, 42, 3' 
declare @str nvarchar(max) 

set @str = 'select listing_id, rpt_id, name_en, phone 
from tsgb_extract_110107 
where rpt_id in ('[email protected]+')' 
exec sp_executesql @str 
0

使用试试这个样本

--create table tsgb_extract_110107 (rpt_id int , listing_id int, name_en varchar(50) , phone varchar(10))   

    --insert into tsgb_extract_110107 values (1,1,'abc','123'),(33,33,'abc','33'),(691,691,'abc','691'),(58,58,'abc','58'),(3,3,'abc','3') 

    Declare @ID nvarchar(max) 
    set @ID = '33, 691, 688, 58, 42, 3' 

    Declare @sql nvarchar(max) 
    set @sql = 'select listing_id, rpt_id, name_en, phone 
    from tsgb_extract_110107 
    where rpt_id in ('+ @ID + ') ' 
    select @sql 
    EXEC sp_executesql @sql 
0

什么帮助了我是这样的功能:

CREATE FUNCTION [dbo].[f_SplitString] (@sep char(1), @s varchar(512)) 
RETURNS table 
AS 
    RETURN (
     WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s) 
      UNION ALL 
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
      FROM Pieces 
      WHERE stop > 0 
     ) 
     SELECT pn, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s 
     FROM Pieces 
    ) 

放在where子句中像这样:

where Ids in (SELECT s FROM [dbo].[f_SplitString](',', @Ids)) 
相关问题