2010-07-23 168 views
0

我得到了下面一段SQL代码,它给了我一个标题错误。错误:子查询返回多个值

WHERE 

     (SELECT Tokens FROM StringSplitter(@DocumentValue, '|', 1)) IN 
     (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) 

凡@DocumentValue和@sortValue是由分隔符隔开两个连接的字符串(在这种情况下,“|”)。

StringSplitter函数返回每个单独字符串的表。例如Fox | Brown | SQL将返回一个包含三条记录的表:Fox,Brown和SQL。

发生是两组字符串对比,将它们插入到另一个表(因此WHERE),如果任何来自@DocumentValue各个串的匹配任何从@sortValue的个体线。

此实现有缺陷。如果@DocumentValue和@sortValue包含多个匹配的字符串,则查询失败,并返回给定的错误。

这么说,我怎么能解决这个错误,考虑到我不在乎匹配其中值,只要我知道要不要至少人做?

SQL Server 2008中

+1

哪个数据库? – pascal 2010-07-23 15:11:58

+0

好点。 T-SQL,SQL Server 2008.我会去编辑它。 – 2010-07-23 15:12:26

回答

2
<your action here> 
WHERE EXISTS (SELECT 1 FROM dbo.StringSplitter(@DocumentValue, '|', 1) AS a 
         JOIN dbo.StringSplitter(@sortValue, '|', 1) AS b 
         ON a.Tokens = b.Tokens) 
3

试着在替代相交。也许是这样的:

declare @tokenTable table (token nvarchar(50) primary key) 
insert into @tokenTable (select ...) INTERSECT (select ...) 

编辑:不立即知道我疯玩了这一点。下面的作品,虽然(请注意,我用@documentValue和@sortValue表,因为我没有你的分路器功能):

declare @documentValue table(token nvarchar(50) primary key) 
declare @sortValue table(token nvarchar(50) primary key) 
declare @result table(token nvarchar(50) primary key) 

insert into @documentValue (token) values ('A') 
insert into @documentValue (token) values ('B') 
insert into @documentValue (token) values ('C') 
insert into @sortValue select * from @documentValue 
delete from @sortValue where token = 'C' 


insert into @result 
    select 
     A.* 
    from 
     @documentValue A 
    inner join 
     @sortValue B 
    on 
     A.token = B.token 
select * from @result 
+0

将IN更改为INTERSECT给了我一个语法错误。 – 2010-07-23 15:25:26

+0

找出问题所在 - 在SQL Server 2000实例上进行测试!您也可以替换此插入查询:从@documentValue \t插入到@result \t选择令牌\t相交 \t从@sortValue – expedient 2010-07-23 15:37:44

+0

选择令牌'intersect'应该可以正常工作了这一点,+1。我把语法放到了我的答案中。 – 2010-07-23 15:51:51

0

加入?

(SELECT count(*) 
    FROM StringSplitter(@DocumentValue, '|', 1) AS one JOIN 
     StringSplitter(@sortValue, '|', 1) AS two ON one.Tokens = two.Tokens 
) > 0 
1

你只是缺少一个WHERE,我认为(或有它在错误的地方)

INSERT INTO YourTable 
SELECT Tokens FROM StringSplitter(@DocumentValue, '|', 1) 
WHERE Tokens IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) 
INTERSECT

虽然@权宜的回答应该能正常运行以及

INSERT INTO YourTable 
SELECT Tokens FROM StringSplitter(@DocumentValue, '|', 1) 
INTERSECT 
SELECT Tokens FROM StringSplitter(@sortValue, '|', 1) 
0
insert into yourNewTableGoesHere(Token) 
select a.Tokens 
from StringSplitter(@DocumentValue, '|', 1) a 
where exists (select Tokens 
       from StringSplitter(@sortValue, '|', 1) 
       where Tokens = a.Tokens) 
0

为什么不能t把你的代币放在两个临时表中

(SELECT Tokens INTO #DocTokens FROM StringSplitter(@DocumentValue, '|', 1)) IN 
(SELECT Tokens INTO #SortTokens FROM StringSplitter(@sortValue, '|', 1)) 

SELECT d.Tokens INTO #Tokens FROM #DocTokens d JOIN #SortTokens s ON s.Tokens = d.Tokens 

这会给你只有匹配。然后,您可以将您的查询加入#Tokens以过滤您的主要选择。