2016-08-16 10 views
0

このストアドプロシージャのオプションのパラメータを使用してNULL(NULLではない)列を「NULL」として更新する方法があるのだろうか。省略時の値と同じに設定されている省略可能なパラメータを決定するか、デフォルト値を持つ

たとえば、

テストIDテストTEST2

更新だけ試験カラムテストIDテストTEST2

1 NULL 3

ヌルとしてEdit-- これは一般的ですテーブルの部分的な更新のための構造体。しかし、(任意のパラメータのデフォルト値と異なる値を持つ)列を(オプションのパラメータのデフォルト値)として設定することはできません。テーブルの部分的な更新ではなく、これ以外の提案がある場合は、共有してください。

おかげ

ALTER PROCEDURE [Pay].[UpdTest] (
    @testid int, 
    @test int =null, 
    @test2 int =null 
) 
AS 
BEGIN 
    UPDATE 
     [Pay].[Test] 
    SET 
     test =COALESCE(@test,test) 
     test2 =COALESCE(@test2,test2) 
    WHERE 
     testid [email protected] 
END 
+0

あなたの質問は何ですか:それは決定または更新ですか? – TheGameiswar

+1

可能ならば、更新するだけでyesと判断する必要はありません。 – metehanm

+0

COALESCEは最初のNULL以外の値を返し、すべてがNULLの場合はNULLを返します。つまり、指定されたコードでは、テスト列がすでにNULLでない限り、@testのnullのデフォルトは無視されます。特定の列をNULLに更新する場合は、最初にCOALESCEの使用を検討することをお勧めします。 – Kentaro

答えて

0

オプションパラメータのデフォルト値を明示的に指定された場合伝える方法があります。速く汚れた方法は、コマンドをリテラルとしてSQLに渡し、ラッパー・プロシージャーを使用してパラメーターをテストすることです。ラッパー・プロシージャーのデフォルト値をハードコードする必要があるので、変更された場合は、もちろんラッパーも変更する必要があることに注意してください。

以下は、入力SQLコマンドを非常に簡単に処理する方法の例です。このラッパーから、メイン・プロシージャーに何をすべきかを通知するフラグを戻すことができます。

CREATE PROCEDURE TestWapper 
    (@RESULT INT OUTPUT) 
AS 
SET NOCOUNT ON; 
    DECLARE 
     @SQL AS NVARCHAR(200), 
     @NumberCommas AS INT, 
     @LOC1 AS INT, 
     @LOC2 AS INT, 
     @Param1Literal AS VARCHAR(50), 
     @Param2Literal AS VARCHAR(50) 

--Set the SQL Command 
    SET @SQL = N'EXEC SetColumnNull 5, NULL'; 

--How many commas can tell us how many parameters MIGHT have been used 
    SET @NumberCommas = LEN(@SQL)-LEN(REPLACE(@SQL,',','')); 

--Iterate through and see what the parameters are  
    IF @NumberCommas = 0 
     BEGIN 
      PRINT 'no optional parameter was specified' 
      SET @RESULT = 0 
      RETURN 
     END 
    IF @NumberCommas = 1 --the 1st optional parameter might have been specified 
     BEGIN 
      --let's get the location of the comma first 
       SET @LOC1 = CHARINDEX(',',@SQL); 
       SET @Param1Literal = LTRIM(SUBSTRING(@SQL,@LOC1+1,LEN(@SQL))) 
       IF @Param1Literal = 'NULL' 
        BEGIN 
         PRINT 'parameter1 : ' + @Param1Literal + ' was used' 
         SET @RESULT = 1; 
        END 
       ELSE 
        SET @RESULT = 0; 

       RETURN 
     END; 

    --IF @NumberCommas = 2 -- do similar things 

END 

あなたはコマンドテキストへのアクセス権を持っていない場合、私は指定されたパラメータ値としてNULLにデフォルトパラメータ値としてNULLを比較する方法が表示されません。

関連する問題