2012-05-20 3 views
0

2005 년부터 SQL Server 2008 R2로 업그레이드했는데 이제는이 쿼리가 더 이상 작동하지 않습니다 (원인이되는 것을 배제하지는 않지만). 나는이 문제를 보여주기 위해 이름/쿼리를 단순화 : 열 공사 == 'X'또는 HQ는 == 'X'다음 결과에 포함하는 경우MDX에서 비대칭 집합 매개 변수화?

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)}")  
) 

는 기본적으로이 논리 OR 말하는 것입니다. 이것은 비대칭 (sic) 집합으로 알려져 있습니다.

위 오류는 다음과 같습니다. 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) 
) 

STRTOPUPLE을 (를) 시도하고 같은 오류가 발생했습니다.

동적으로 쿼리를 작성할 수는 있지만, 특히 매개 변수를 사용하여 정상적으로 작동 했으므로이 위험을 피하는 것이 좋습니다.

질문 :이 비대칭 집합을 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)}  
) 
:이 키 것이다 ALLMEMBERS를 대체하여 오류를 제거하지만, 내 구문이 나쁜 것 같지 않습니다 일반적으로 보여에만 유용하므로 실제로는 아무것도 필터링하지 않습니다 주

나는 덜 동적 인 방식으로이 작업을 할 수 있었지만 꽤 성가시다.

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)") 
    }  
) 

답변

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)}") 

(: 나는 각 하나에 대한 STRTOSET 전화를해야하기 때문에 기본적으로 내 필터는 다양한 매개 변수로 구분 될 필요가있다 x, y, z) 튜플 또는 괄호 연산자입니다. 예 : ({}, {})은 교차 결합입니다.

은 아마 당신은 세트로 명시 적으로 포장이 필요합니다

{ [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] } } 

희망을.

+0

죄송합니다. 비대칭 세트의 목적에 대한 설명이 업데이트되었습니다. 속기를 사용하면'{(Corp.All, Local.All, HQ.Yes), (Corp.Yes, Local.All, HQ.All)}} 패턴을보다 쉽게 ​​볼 수 있습니다. 이것은 본질적으로 HQ가 어디에 있느냐고 말합니다. 이것은 서로 다른 열에서 논리적 OR을 모방하는 방법입니다. – AaronLS