关键字在SQL Server中无法正常工作?

时间:2017-04-18 07:21:42

标签: sql sql-server sql-server-2008-r2

我正在研究SQL Server 2008 R2。

以下查询:

select alloted_area 
from tbllogin 
where nid = 82

返回此

alloted_area
1,101,1002,79,365,297

以下查询

select * 
from tblarea 
where nid in (1, 101, 1002, 79, 365, 297)

返回此

nid     area_name
------------------
1       RAJASTHAN
101     RAJASTHAN
79      RAJASTHAN
297     RAJASTHAN
365     RAJASTHAN
1002    RAJASTHAN

但是以下查询

select * 
from  tblarea 
where nid in (select alloted_area from tbllogin where nid = 82)

生成此错误:

  

转换varchar值时转换失败   '1,101,1002,79,365,297'到数据类型int

我该怎么办?

也许我必须根据逗号来制作alloted_areastbllogin的行。我该怎么做?

正如评论中所建议的,我尝试不将数据存储为逗号分隔值,但这意味着要创建一个整个表来存储该信息。那么有什么方法可以在我的情况下达到预期的效果。

5 个答案:

答案 0 :(得分:2)

试试这个:

DECLARE @values NVARCHAR(100) = (select alloted_area from tbllogin where nid = 82)
DECLARE @sqlQuery NVARCHAR(200) = ' select *  from  tblarea  where nid in ( '+ @values +' ) '
EXEC (@sqlQuery)

希望它有所帮助。 :)

答案 1 :(得分:1)

这将起作用

DECLARE @a VARCHAR(max) = (select alloted_area from tbllogin where nid = 82)
select * from  tblarea where nid in (select sID from splitstring(@values,','))

答案 2 :(得分:1)

以下是两种不涉及变量的不同方法: SplitString是sqlserver 2016的一个新功能,所以我包含了一个为sqlserver 2008实现StringSplit的方法。

只要表tbllogin中的nid是唯一的,第一种方法就会起作用:

SELECT
  * 
FROM
  tblarea 
WHERE
  nid in 
    (
      SELECT Value
      FROM
        [SplitString]((SELECT alloted_area FROM tbllogin WHERE nid = 82),',')
    )

第二种方法能够处理表tbllogin中的nid不唯一时的情况:

SELECT
  * 
FROM
  tblarea 
WHERE
  nid in 
  (
    SELECT x.value
    FROM tbllogin
    CROSS APPLY 
      [SplitString](alloted_area,',')x
   WHERE nid = 82
)

您可以使用此功能模仿sqlserver 2008中的StringSplit:

CREATE FUNCTION [dbo].[SplitString]
(
    @List NVARCHAR(MAX),
    @Delim VARCHAR(255)
)
RETURNS TABLE
AS
    RETURN ( 
        SELECT 
          [Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
          CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
        FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
          FROM sys.all_objects) AS x
          WHERE Number <= LEN(@List)
          AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
    );

答案 3 :(得分:-1)

nId是一个int类型。看起来alloted_area是varchar类型。交叉检查。

答案 4 :(得分:-1)

这可能是因为在子选择语句中未正确声明int类型。这是cast()方法运行良好的地方。

尝试:cInt(alloted_area) AS alloted_area_int

select * from tblarea where nid in (select cInt(alloted_area) AS alloted_area_int from tbllogin where nid=82)