0

私のクエリは「exists」関数をフィルターとして使用し、その中にスカラー値関数があります。スカラー値関数には、cte と "(select top 1 1)" が含まれます。私が存在する場合、それはまったくフィルタリングされません。むしろ、「where 1=(svf)」を使用するとうまくいくようです。存在するクエリで何かを見逃したり、間違ったりしましたか?


SELECT * FROM TBL1
WHERE EXISTS (SELECT SVF(1,2))
--where SVF is my scalar valued from which returns bit and looks like as shown below.

CREATE FUNCTION SVF ( @x int, @y int ) RETURNS bit AS BEGIN declare @result bit ;WITH T1 AS ( SELECT * from tbl2 ) SELECT @result= (select top 1 1 FROM t1 ) return isnull(@result,0) END GO

--the following query works SELECT * FROM TBL1 WHERE 1=(SELECT SVF(1,2))

4

2 に答える 2

2

EXISTS( )演算子

サブクエリに行が含まれている場合は TRUE を返します。

(強調追加)

スカラー関数は 1 または 0 のいずれかの値を返すため (Damien が指摘したように NULL でも満たす)、IT IS はvalue を返すため、これは重要です。

また、値を返すため、EXISTSは常に TRUE を返します。

あなたは基本的にSQL Serverに尋ねています:

-- Doesn't matter what my function returns as it's always going to return a row...
BEGIN 
-- then run this query
SELECT * FROM TBL1;
END;

スカラー関数は通常セットベースではないため、通常はパフォーマンスキラーであるため、関数を使用しないようにクエリを書き直してください。

于 2016-05-11T13:46:00.797 に答える