我正在研究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_areas
中tbllogin
的行。我该怎么做?
正如评论中所建议的,我尝试不将数据存储为逗号分隔值,但这意味着要创建一个整个表来存储该信息。那么有什么方法可以在我的情况下达到预期的效果。
答案 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)