2013-07-15 41 views
1

你能告诉我为什么我得到这个错误吗?什么样的表达式“=”?

我不认为使用任何类型的表达式“=”?

SELECT * 
FROM 
    (SELECT 
     ROW_NUMBER() OVER(ORDER BY 
      CASE WHEN @SortType = '1' THEN mt.Ad END ASC, 
      CASE WHEN @SortType = '2' THEN mt.Ad END DESC, 
      CASE WHEN @SortType = '3' THEN mt.Fiyat END ASC, 
      CASE WHEN @SortType = '4' THEN mt.Fiyat END DESC) AS RowNr, * 
    FROM @MainTable mt 
    WHERE mt.Fiyat > @MinPrice AND mt.Fiyat < @MaxPrice 
     AND mt.MarkaId IN (CASE WHEN @BrandFilter != '' 
          THEN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ',') bf) 
          ELSE (mt.MarkaId) 
          END) 
    ) Result 
WHERE 
    RowNr > ((@PageNr-1) * 10) AND RowNr <= ((@PageNr) * 10) 

SQL Server出现此错误;

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

我的分裂函数返回多表,但我写的IN没有=

感谢

+3

我不认为情况下,可以返回表值,仅标量 –

+0

你能不能用言语形容* *正是你想要的时候发生什么'@BrandFilter ='''? –

回答

6

CASE WHEN @BrandFilter != '' THEN条款预计一个标值,但要调用UDF,可以返回多行。

+0

为什么它期望我使用的单个标量值“AND mt.MarkaId IN” –

+0

您从split函数获取一个值表,但是您通过一个* CASE表达式来传递它*期望一个标量值*。这是由'IN'表达式包围的事实是无关紧要的。 –

2

你不能以这种方式使用CASE。它看起来像你想代码的情况是这样的:

(@BrandFilter = '' OR 
@BrandFilter != '' AND mt.MarkaId IN (SELECT bf.Data FROM dbo.Split(@BrandFilter, ','))) 
相关问题