2016-09-28 1 views
2

私は@Valueパラメータを受け取るこのストアドプロシージャを持っています。パラメータ値がNULLの場合、その値を使用してデータをフィルタリングするか、またはフィルタリングを無視する必要があります。XQuery内でsql:variableとNULLを比較する方法

DMLを使用して

WHERE @Value IS NULL OR Value = @Value 

のような単純なものだろうが、私は、XQuery式の内側に同じアイデアを使用する方法がわかりません。空の値がnullの場合、リテラル文字列、または

  • として@Valueが使用していることを設定

    • :私はすることで、この問題を回避することができ

      DECLARE @Value AS VARCHAR(100) = 'f7fc6b6c-bb1b-4961-bb94-1053500436ac' 
      
      SELECT   Form.FormType, 
             FormData   .value('(/*/Created)[1]' , 'date'  ) Created, 
             FormDataItem.this.value('@Source'   , 'varchar(100)') Source, 
             FormDataItem.this.value('@Value'   , 'varchar(100)') Value, 
             FormDataItem.this.value('@Text'    , 'varchar(100)') Text 
      FROM   Form WITH (NOLOCK) 
      CROSS APPLY  Form.FormData.nodes('//*[ 
             (
              (sql:variable("@Value") = "" and @Value != "") or 
              (sql:variable("@Value") != "" and @Value = sql:variable("@Value")) 
             )]') FormDataItem(this) 
      

      :今、私はこのようなコードを持っていますいくつかの動的アプローチでXQuery式を作成し、それを実行してください。sp_executesql

    私はそれを避けたいと思います。

    sql:variableをXQuery内のNULLの値と比較する方法を教えてください。

  • +0

    これは[exist()](https://msdn.microsoft.com/en-us/library/ms189869.aspx?f=255&MSPPError=-2147217396)で実現できますか? – techspider

    +1

    明示的なシーケンスは含まれていないので直感的ではありませんが、[空(sql:variable( "@Value"))]](https://msdn.microsoft.com/library/ms186394)を実行する必要があります。 –

    +0

    @JeroenMostertあなたが正しいです、この場合は「空」がうまくいきます。それを答えて、私はこの質問を閉じるでしょう。ありがとう! –

    答えて

    1

    @Valueの場合は@ValueNULL(空の文字列が対象とならない)であるときempty(sql:variable("@Value"))が正確trueで、T-SQL変数です。

    関連する問題