2016-11-17 11 views
0

私は、SQL関数からの結果セットを一時テーブルに戻して、この一時テーブルをさらに利用しようとしているクエリ。SQL関数からのテーブル結果を使用した問題SQLビューからのテーブル結果さらにQUERY

最初にクエリはSQLビューを使用して結果セットを返し、それをクエリで使用しましたが、私はこれをもう少し効率的にしようとしていますので、ビューをSQL関数に変更してビューのすべてを返すのではなく、データのサブセットを照会できるようにします。

私は新しいSQL関数を実行して元のビューをすべて比較しますが、新しいSQL関数を使ってこのSQLビュー(メインSQLクエリ)を置き換えると、奇妙なことが起きます。

私はトラブルはこれとあれば交換を撮影すると2が、その後の後、「選択」クエリが何であるかのスニペット(私は実際の名前を削除し、一時名に置き換えられている注)

 declare @parm1 varchar(2) = '' ; 
     declare @ResultSet table ( 
      col int, 
      col1 varChar(2), 
      col2 int, 
      col3 int, 
      col4 int, 
      col5 varChar(10), 
      col6 int, 
      col7 int, 
      col8 int, 
      col9 int, 
      col10 decimal(38,1), 
      col11 float, 
      col12 float) 

     insert into @ResultSet 
     Select col, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12 FROM udfFunction(@parm1) 
     --Select col, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12 FROM wvView 

     SELECT v1.col, v1.col1, v1.col13, v1.col5, v1.col4, v2.col14, v1.col15, v1.col16, v1.col17, v1.col8, v1.col9,  
         COALESCE (TP.col12, TS.col12, TW.col12, TV.col12, TA.col12, 0.40) AS col12,  
         COALESCE (SP.col11, SS.col11, SW.col11, SV.col11, SA.col11, CASE WHEN v1.col5 = 'CODE' THEN 4 ELSE 22 END) AS col11,  
         COALESCE (TP.col12, TS.col12, TW.col12, TV.col12, TA.col12, 0.40) * (v1.col17 - v1.col9) AS field1,  
         COALESCE (SP.col11, SS.col11, SW.col11, SV.col11, SA.col11, CASE WHEN v1.col5 = 'CODE' THEN 4 ELSE 22 END) * (v1.col14 - v1.col16) * 227 AS field2 
        FROM wba.ivView1 AS v1 
        INNER JOIN dbo.View2 AS v2 ON v2.col14 = v1.col14 
        LEFT OUTER JOIN @ResultSet AS SP ON SP.col = v1.col And SP.col1 = v1.col1 And SP.col4 = v1.col4 And SP.col2 = v2.col2 And SP.col3 = v2.col3 And SP.col7 = v2.col7 And SP.col6 = v2.col6 And SP.col5 = v1.col5  
       LEFT OUTER JOIN @ResultSet AS SS ON SS.col = v1.col AND SS.col1 = v1.col1 AND SS.col4 = v1.col4 AND SS.col2 = v2.col2 AND SS.col3 = v2.col3 AND SS.col7 = v2.col7 AND SS.col6 IS NULL AND SS.col5 = v1.col5  
        LEFT OUTER JOIN @ResultSet AS SW ON SW.col = v1.col And SW.col1 = v1.col1 And SW.col4 = v1.col4 And SW.col2 = v2.col2 And SW.col3 = v2.col3 And SW.col7 Is NULL And SW.col6 Is NULL And SW.col5 = v1.col5  
        LEFT OUTER JOIN @ResultSet AS SV ON SV.col = v1.col AND SV.col1 IS NULL AND SV.col4 = v1.col4 AND SV.col2 = v2.col2 AND SV.col3 = v2.col3 AND SV.col7 = v2.col7 AND SV.col6 IS NULL AND SV.col5 = v1.col5  
        LEFT OUTER JOIN @ResultSet AS SA ON SA.col = v1.col And SA.col1 Is NULL And SA.col4 = v1.col4 And SA.col2 = v2.col2 And SA.col3 = v2.col3 And SA.col7 Is NULL And SA.col6 Is NULL And SA.col5 = v1.col5  
        LEFT OUTER JOIN @ResultSet AS TP ON TP.col = v1.col AND TP.col1 = v1.col1 AND TP.col4 = v1.col4 AND TP.col2 = v2.col2 AND TP.col3 = v2.col3 AND TP.col7 = v2.col7 AND TP.col6 = v2.col6 AND TP.col5 IS NULL  
        LEFT OUTER JOIN @ResultSet AS TS ON TS.col = v1.col And TS.col1 = v1.col1 And TS.col4 = v1.col4 And TS.col2 = v2.col2 And TS.col3 = v2.col3 And TS.col7 = v2.col7 And TS.col6 Is NULL And TS.col5 Is NULL  
        LEFT OUTER JOIN @ResultSet AS TW ON TW.col = v1.col AND TW.col1 = v1.col1 AND TW.col4 = v1.col4 AND TW.col2 = v2.col2 AND TW.col3 = v2.col3 AND TW.col7 IS NULL AND TW.col6 IS NULL AND TW.col5 IS NULL  
        LEFT OUTER JOIN @ResultSet AS TV ON TV.col = v1.col And TV.col1 Is NULL And TV.col4 = v1.col4 And TV.col2 = v2.col2 And TV.col3 = v2.col3 And TV.col7 = v2.col7 And TV.col6 Is NULL  
        LEFT OUTER JOIN @ResultSet AS TA ON TA.col = v1.col AND TA.col1 IS NULL AND TA.col4 = v1.col4 AND TA.col2 = v2.col2 AND TA.col3 = v2.col3 AND TA.col7 IS NULL AND TA.col6 IS NULL 
        WHERE (v1.col1 = parm1 or parm1 = '') and ((v1.cm_Count > v1.col8) OR (v1.col8 = 0)) 
        order by col5 

が含まれています@ResultsSetの内容が同じであることを「挿入」します。しかし、この結果セットがJOINにさらに適用されると、SQL関数を使用して@resultsetが設定されていれば再生されるように見えます。なぜこれが起こっているのかについて。

ご協力いただければ幸いです。ここからの要求を1として

は、SQL関数およびSQLビューを作成するために使用されているものである

SQLビュー

  create view [schema].[wvView] with schemabinding as 
     Select v2.col1, v2.col2, col3, col4, v2.col5, v2.col6, v3.col7, v3.col8, (sum(v2.col9)) As col9, sum(col10) As col10, 
       sum(v1.col11) AS col11, cast(sum(v1.col11) AS float)/100/sum(v2.col9) AS col12, cast(sum(v1.col11) AS float)/sum(v2.col10) AS col13 
     FROM schema.ivView1 v1 
     INNER JOIN schema.ivView2 v2 ON v2.col1 = v1.col1 AND v2.col2 = v1.col2 AND v2.col5 = v1.col5 AND v2.col6 = v1.col6 AND v2.col14 = v1.col14 
     INNER JOIN dbo.wvView3 v3 ON v3.col14 = v2.col14 
     WHERE v2.col10 > 0 
     GROUP BY grouping sets( 
          (v2.col1, v2.col2, col3, col4, v2.col5), 
          (v2.col1, v2.col2, col3, col4, v2.col5, v2.col6), 
          (v2.col1, col3, col4, v2.col5, col8), 
          (v2.col1, col3, col4, v2.col5), 
          (v2.col1, v2.col2, col3, col4, v2.col5, col8), 
          (v2.col1, v2.col2, col3, col4, v2.col5, v2.col6, col8), 
          (v2.col1, v2.col2, col3, col4, v2.col5, col8, v3.col7), 
          (v2.col1, v2.col2, col3, col4, v2.col5, v2.col6, col8, v3.col7) 
     ) 

また、ここでの定義である

 create function schema.udfFunction(parm1 as varchar(2)) 
    returns @rtnTable table ( 
    col1 int, 
    col2 varchar(2), 
    col3 bit, 
    col4 bit, 
    col5 bit, 
    col6 varchar(10), 
    col7 int, 
    col8 int, 
    col9 int, 
    col10 int, 
    col11 decimal(38,1), 
    col12 float, 
    col13 float) 
    AS 
    BEGIN 
     declare @tmp as varchar(2) = parm1; 
     insert into @rtnTable 
       Select v2.col1, v2.col2, col3, col4, v2.col5, v2.col6, v3.col7, v3.col8, (sum(v2.col9)) As col9, sum(col10) As col10,  
       sum(v1.col11) AS col11, cast(sum(v1.col11) AS float)/100/sum(v2.col9) AS col12, cast(sum(v1.col11) AS float)/sum(v2.col10) AS col13 
       FROM schema.ivView1 v1  
       INNER JOIN schema.ivView2 v2 ON v2.col1 = v1.col1 AND v2.col2 = v1.col2 AND v2.col5 = v1.col5 AND v2.col6 = v1.col6 AND v2.col14 = v1.col14  
       INNER JOIN dbo.wvView3 v3 ON v3.col14 = v2.col14 
       WHERE v2.col10 > 0 and (v2.col2 = @tmp or @tmp = '') 
       GROUP BY grouping sets( 
            (v2.col1, v2.col2, col3, col4, v2.col5), 
            (v2.col1, v2.col2, col3, col4, v2.col5, v2.col6),  
            (v2.col1, col3, col4, v2.col5, col8), 
            (v2.col1, col3, col4, v2.col5),  
            (v2.col1, v2.col2, col3, col4, v2.col5, col8),  
            (v2.col1, v2.col2, col3, col4, v2.col5, v2.col6, col8), 
            (v2.col1, v2.col2, col3, col4, v2.col5, col8, v3.col7),  
            (v2.col1, v2.col2, col3, col4, v2.col5, v2.col6, col8, v3.col7) 
       ) 
     return 
    END 

SQL関数MSSQLからのビュー

MSSQL View Definition

私は気づいていた1つの列が異なるので、それを編集し、どのように行くかを参照してください。

おかげ

+0

ビューを機能に変更した後、すべての列が正しいデータ型で返されているかどうかを確認しましたか? @ResultSetの中のいくつかの列に小数点と小数点を使用していることがわかります。そのため、関数から返されたデータを失っている場合は、ビューと実際に比較しなかったパラメータのために、あなたは合体から別の結果を得るかもしれません。比較のためにビューと関数を追加することもできますか? – DoanCan

+0

また、私は(関数のための)テーブル定義を作成していたときに私は言及する価値があると思った – jd11

答えて

0

ソリューション機能とビューの両方のすべての列が期待通りに一度行われ、すべてが働いていた同じタイプであったことを確認しました。

関連する問題