2013-05-14 96 views
0

我需要做此查询:SQL错误转换数据类型为varchar到数字

declare @no as varchar(100)

set @no='11,2,23' 

select * from ft (nolock) where fno in (@no) 

,但有此错误的所有时间:错误转换数据类型为varchar到数字

的FNO是表中的数字

+1

@no被声明为varchar,你可以做这样的Exec('select * from dbo.CM_Address(nolock)'('+ @ no +')'中的ID – bummi 2013-05-14 10:38:44

+1

您应该阅读关于SQL Server数组中的这篇文章http://www.sommarskog.se/arrays-in-sql -2008.html虽然它可能不会为您提供确切的T-SQL来解决您的问题,但它肯定会帮助您理解为什么当前的SQL不起作用以及如何解决它。 – codingbadger 2013-05-14 10:42:44

+0

以逗号分隔的多个参数与发生*包含*逗号的单个字符串参数之间存在差异。 SQL中的情况与我所能想到的任何其他编程语言一样。为什么你会期望SQL Server检查单个参数并决定将其自动转换为多个参数? – 2013-05-15 06:53:02

回答

4

由于LIKE需要数据作为表,因此无法直接选择数据,如in (@no)。请尝试:

declare @no nvarchar(max) 
set @no='11,2,23' 

select * from ft (nolock) where fno in ( 
    SELECT 
     Split.a.value('.', 'VARCHAR(100)') AS CVS 
    FROM 
    (
     SELECT 
      CAST ('<M>' + REPLACE(@no, ',', '</M><M>') + '</M>' AS XML) AS CVS 
    ) AS A CROSS APPLY CVS.nodes ('/M') AS Split(a)) 
+0

+1很棒。声明中的XML语法对我来说仍然是巫术。 – 2013-05-14 10:49:34

+0

您的+1转到stackoverflow :)从它学到很多技巧! – TechDo 2013-05-14 10:51:14

0

您可以轻松地完成你试图用一个表变量,而不是仅仅一个varchar变量创建查询:

declare @t table (
     n int 
) 

insert into @t 
values 
(1) 
,(2) 
,(3) 

select 
     * 
from someTable 
where n in (
     select 
      n 
    from @t 
) 
相关问题