2011-07-21 5 views
0

私はビジネスインテリジェンス開発スタジオ(Microsoft Reporting Services)で構築されているレポートのモデルを生成している他の誰かに書かれたコードを修正しようとしています。int(SELECT varchar ...)は機能しますか?

これが必要かどうか疑問に思っていましたか?

WHERE (convert(varchar,R.Kommunenr) COLLATE DATABASE_DEFAULT IN (SELECT Item FROM dbo.Split('"+ @kommune+ "', ',') AS Split_1))" 

の$ Kommuneのは、このように構築されるテキストです: "kommune1、kommune2、kommune3、..."

は、それが(項目を選択し、INT(R.kommunenrが)になっていることを確認しても大丈夫ですFROM dbo.Split( '"+ @ kommune +"'、 '、')AS Split_1)はvarcharです。このように

WHERE (R.Kommunenr IN (SELECT Item FROM dbo.Split('"+ @kommune+ "', ',') AS Split_1)) 

問題はコードを実行できません。コードは実行できません。実行する権限はありません。

+0

この特別なケースでは、スプリット機能のエイリアシングは絶対に必要ではありません(両方の方法で動作することができます)。 –

答えて

0

TSQL暗黙の変換では、VARCHARは、INTにキャストされ、その逆もありません。

r.kommunenrINTdbo.split戻りINTにキャスト可能VARCHARないのであれば、あなたの2番目のクエリは失敗します。

あなたはr.kommunenrにインデックスから利益を得たい場合は、この試みることがあります。これは、数値が、INTに直接キャスト可能ではありません1E8のようなエッジケースを処理します

SELECT * 
FROM r 
WHERE kommunenr IN 
     (
     SELECT CASE IsNumeric(item) 
       WHEN 1 
       THEN 
         CASE 
         WHEN CAST(item AS FLOAT) = CAST(CAST(item AS FLOAT) AS INT) 
         THEN 
           CAST(CAST(item AS FLOAT) AS INT) 
         END 
       END 
     FROM dbo.split(@kommune) split1 
     ) 

を。

+0

http://msdn.microsoft.com/en-US/library/ms177682(v=SQL.90).aspxこれを_test式と解釈し、_subquery_ **が完全に同じデータ型である必要がありますか? _test式_がintで、_subquery_がvarcharの場合、どうなりますか?私が求めているのは、クエリが実行され、すべてが含まれているということです。私は誰かがエラーを予期するかもしれないと思った、または行がないと思ったおそらく問題はコードの他の部分です... –

+0

@Øyvind:this query: 'SELECT 1 WHERE CAST(1 AS INT)IN(SELECT CAST( '1' AS NVARCHAR) 1 WHERE CAST(1 AS INT)IN(SELECT CAST( 'string' AS NVARCHAR))は実行時エラーで失敗します。あなたのテーブルの定義を投稿してください。 – Quassnoi

+0

あなたの例のサブクエリは、 'ISNUMERIC()'が '0'を返す* exclude *行と、数値が整数でない行にフィルタリングする必要があります。それ以外の場合は、前述のケースでNULLを返し、 'IN'演算子が' UNKNOWN'を返すようになります(http://msdn.microsoft.com/en-us/library/ms177682.aspx)。三項論理。 –

関連する問題