0

OR @MyParam IS NULL チェックを回避するために、次の 2 つのクエリを書き直す必要があります (「CASE が正しく機能していない」で説明されているように、CASE ステートメントを使用して)

次のクエリをその形式で書き直すことは可能ですか?

注: fn_Split 関数は、ストアド プロシージャ SQL Server 2008 で `IN` 演算子を使用して文字列パラメーターを渡す方法で使用できます。

DECLARE @MyParam VARCHAR(MAX)
SET @MyParam = '2,3'

DECLARE @MyTable TABLE (EmpID INT)

INSERT INTO @MyTable VALUES (1)
INSERT INTO @MyTable VALUES (2)
INSERT INTO @MyTable VALUES (3)
INSERT INTO @MyTable VALUES (4)


--Query 1
SELECT * 
FROM @MyTable M
WHERE (
        M.EmpID IN (SELECT CONVERT(int,Value) FROM fn_Split(@MyParam, ','))
        OR @MyParam IS NULL
       )


--Query 2
SELECT * 
FROM @MyTable M
WHERE (EXISTS   (
                  SELECT CONVERT(int,Value) 
                  FROM fn_Split(@MyParam, ',')
                  WHERE CONVERT(int,Value)  =  M.EmpID
                  )
                  OR @MyParam IS NULL
       )
4

1 に答える 1

1

左結合を使用する

SELECT m.* 
FROM @MyTable M
    left join (SELECT CONVERT(int,Value) v FROM fn_Split(@MyParam, ',')) t 
on m.EmpID = t.v 
where v is not null or @MyParam is null

理想的には、複数の値を含む文字列をパラメーターとして渡さないでください。これがストアド プロシージャの場合は、テーブル値パラメーターを使用します。

于 2013-08-14T11:05:50.670 に答える