簡體   English   中英

在SQL中將varchar值轉換為int錯誤時,轉換失敗

[英]conversion failed when converting the varchar value to int error in SQL

我只想運行一個查詢,但過了一會兒卻給了我“轉換失敗”錯誤。 這是我要運行的查詢:

'將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變量傳遞給查詢。

假設tsgb_extract_110107是表,將varchar與varchar比較可以解決您的問題

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拆分為一個表,然后使用join

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

試試這個

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,
) 

首先,您需要一個字符串拆分器。 這是摘自亞倫·伯特蘭(Aaron Bertrand)的文章文章

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)
    ) 

使用以下查詢

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 ('+@ID+' )' 
exec sp_executesql @str

試試這個樣本

--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

幫我的是這個功能:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM