0

2005 年から SQL Server 2008 R2 にアップグレードしたところ、このクエリが機能しなくなりました (ただし、私が行ったことが原因である可能性は除外しません)。問題を示すために、名前/クエリを簡略化しました。

SELECT
  NON EMPTY
  {
        [BizDim].[County].[County]
      * [BizDim].[name].[name]
  }
  ON COLUMNS,
  {
        [Biz Line Type Dimension].[Line Number].[Line Number]
      * [Biz Line Type Dimension].[Display Name].[Display Name]
  }
  ON ROWS
  FROM [TPS Data View]
  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,STRTOSET("{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]),([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}")    
  )

基本的に、これは列 Corp == 'x' OR HQ == 'x' の場合、結果に含めるかどうかを示す論理 OR です。これは、非対称 (原文のまま) セットとして知られています。

上記はエラーを示します: Tuple 関数は 3 引数のタプル式を予期しています。タプル セット式が使用されました。

STRTOSET 関数を削除すると、完全に機能します。

  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]),([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}    
  )

ただし、実際のクエリはパラメーター化されているため、これは良くないため、STRTO* 関数で動作する必要があります。

  Where (
    STRTOSET(@Counties, CONSTRAINED)  
    ,STRTOSET(@BizTypes)  
  )

STRTOTUPLE を試しましたが、同じエラーが発生しました。

クエリを動的に作成することもできますが、特に以前はパラメーターを使用して正常に機能していたことを考えると、そのリスクを冒すことは避けたいと思います。

問題は、この非対称セットを SQL Server 2008 R2 SSAS で再びパラメーターとして機能させる方法です。

更新:これは、キーを置き換えることでエラーを排除することに注意してください。ただし、実際には何もフィルタリングしないため、一般的に私の構文が悪くないように見えることを示すだけに役立ちます:

  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS),([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}    
  )

私はこれをあまり動的ではない方法で動作させることができましたが、かなり面倒です。基本的に、フィルターは多くの異なるパラメーターに分割する必要があります。それぞれに STRTOSET 呼び出しが必要になるためです。

  Where (
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    ,{
       STRTOSET("([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x])")
      ,STRTOSET"([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)")
    }    
  )
4

1 に答える 1

0

[コメント後に編集]

  Where 
    STRTOSET("{[BizDim].[County ID].&[16]}", CONSTRAINED)  
    * STRTOSET("{([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]),([BizDim].[Corp].[Corp].&[x],[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].ALLMEMBERS)}")  

それらは、タプルまたは括弧演算子のいずれかである ( x, y, z ) 表記によるあいまいさである可能性があります。たとえば、( {}, {} ) はクロス結合です。

おそらく、 set への明示的なラッピングが必要です:

{ [BizDim].[HQ].[HQ].&[x] }

または置き換えます:

([BizDim].[Corp].[Corp].ALLMEMBERS,[BizDim].[Local].[Local].ALLMEMBERS,[BizDim].[HQ].[HQ].&[x]) 

明示的な crossjoin を使用:

{ [BizDim].[Corp].[Corp].ALLMEMBERS * [BizDim].[Local].[Local].ALLMEMBERS * { [BizDim].[HQ].[HQ].&[x] } }

それが役立つことを願っています。

于 2012-05-20T23:19:44.523 に答える