2010-07-23 144 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以過濾您的主要選擇。