2017-01-24 11 views
0

私はいくつかのパラメータを取るSQLストアドプロシージャを持っています。そこに私は=<>のような条件を渡す必要があり、それらをクエリで使用する必要があります。比較演算子をパラメータとして渡し、SQLストアドプロシージャで直接使用します。

現在、私は何が条件であるかを確認し、それに応じてクエリの一部を変更します。私はパラメータとして条件を渡し、クエリで直接使用したいと思います。

@software_type nvarchar(50), 
@software_id nvarchar(50), 
@condition char, 
@version_id float 

クエリ:

DECLARE 
    @BaseQuery nvarchar(max) = N'SELECT DISTINCT Installed_Software.vm_name FROM Installed_Software INNER JOIN Software ON Installed_Software.software_id = Software.software_id INNER JOIN Software_Version ON Installed_Software.software_id = Software_Version.software_id AND Installed_Software.version_id = Software_Version.version_id AND Software.software_id = Software_Version.software_id', 
    @WhereClause nvarchar(max) = ' WHERE 1=1', 
    @ParamList nvarchar(max) = N'@sfType nvarchar(50),@sfId nvarchar(50),@verId float,@cond char' 

IF @software_type IS NOT NULL 
BEGIN 
    SET @WhereClause = @WhereClause + ' AND Software.software_type = @sfType'; 
END 

IF @software_id IS NOT NULL 
BEGIN 
    SET @WhereClause = @WhereClause + ' AND [email protected]'; 
END 

IF @version_id IS NOT NULL AND @condition IS NOT NULL 
BEGIN 
    IF @condition = '=' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id = @verId'; 
    END 
    ELSE IF @condition ='>' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id > @verId'; 
    END 
    ELSE IF @condition='<' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id < @verId'; 
    END 
    ELSE IF @condition = '>=' 
    BEGIN 
     SET @[email protected] + ' AND Installed_Software.version_id >= @verId'; 
    END 
    ELSE IF @condition='<=' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id <= @verId'; 
    END 
    ELSE 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id = @verId'; 
    END 
END 

SET @BaseQuery = @BaseQuery + @WhereClause; 

EXECUTE sp_executesql @BaseQuery, @ParamList, @[email protected]_type, @[email protected]_id, @[email protected]_id; 

私がやりたいことは、このようなものです:

これは私がこれらのパラメータを渡している、私が今やっている方法を

です

IF @version_id IS NOT NULL AND @condition IS NOT NULL 
BEGIN  
    SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id' + '@condition' + '@version_id'; 
END 

これは可能ですか?

+1

それが参考になる:
は、私は次のクエリは、動的SQLバージョンと同じ結果を返すべきであると信じています。 MySQL? MSSQL? – JRLambert

+1

[蹴るのに習慣が悪い](長さなしのVARCHARの宣言)(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length .aspx) - あなたが使用する 'char/varchar'変数とパラメータの長さを常に**提供するべきです。現在、パラメータ '@ condition'はちょうど' CHAR'なので、**正確に1つの長さ**の文字列になります。だから、 '> ='を条件として渡そうとすると '>'だけに切り捨てられています。 –

+0

@ JRLamberそれはMSSQL –

答えて

0

これは可能ですか?YES

はちょうど私がこのために動的SQLを使用しないことをお勧め

SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id ' + '@condition' + ' @version_id'; 
                   ----^    -----^ 
0

構文エラーを回避するためにあなたの状態の間に単一のスペースを追加します。あなたが使用しているサーバーのタグ付き場合

SELECT DISTINCT Installed_Software.vm_name 
FROM Installed_Software 
INNER JOIN Software 
    ON Installed_Software.software_id = Software.software_id 
INNER JOIN Software_Version 
    ON Installed_Software.software_id = Software_Version.software_id 
    AND Installed_Software.version_id = Software_Version.version_id 
    AND Software.software_id = Software_Version.software_id 
WHERE 
(
    @software_type IS NULL 
    OR Software.software_type = @software_type 
) 
AND 
(
    @software_id IS NULL 
    OR Installed_Software.software_id = @software_id 
) 
AND 
(
    @version_id IS NULL 
    OR @condition IS NULL 
    OR (@condition = '=' AND Installed_Software.version_id = @version_id) 
    OR (@condition = '>' AND Installed_Software.version_id > @version_id) 
    OR (@condition = '<' AND Installed_Software.version_id < @version_id) 
    OR (@condition = '>=' AND Installed_Software.version_id >= @version_id) 
    OR (@condition = '<=' AND Installed_Software.version_id <= @version_id) 
) 
関連する問題