2016-11-17 54 views
0

我有這種情況,我試圖從SQL函數返回一個結果集到一個臨時表中,然後在進一步利用這個臨時表查詢。使用SQL函數的表結果的問題與來自SQL查詢的表結果進一步QUERY

最初的查詢是使用SQL視圖來返回結果集並在查詢中使用它,但是我現在試圖使這個效率更高一點,所以我將視圖更改爲sql函數以允許參數能夠查詢數據的一個子集,而不是返回視圖中的所有內容。

當我運行新的SQL函數並再次比較原始視圖時,所有東西都對齊,但是當我用新的SQL函數替換這個SQL視圖(在主SQL查詢中)時,它開始做一些奇怪的事情。

我已經包括的查詢是什麼樣的一個片段(注:我已刪除的實際名稱和臨時名稱進行替換)

 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的進一步下來,似乎起到了如果@resultset已經填充使用SQL函數 - 我無所適從至於爲什麼會發生這種情況。

任何幫助將不勝感激。

根據要求由這裏是正被用於創建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) 
     ) 

SQL函數

 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 

也在這裏是定義來自MSSQL的視圖

MSSQL View Definition

我注意到有一列不同,所以將編輯,看看我怎麼去。

感謝

+0

將視圖更改爲函數後,是否檢查所有列是否正確返回正確的數據類型?我發現你對@ResultSet中的某些列使用了一些浮點數和小數,所以如果你從函數返回後丟失了一些數據,對於某些你沒有真正比較的參數,你的一個連接可能會失敗你可能會從聚結中得到不同的結果。那麼你還可以添加視圖和用於比較的功能嗎? – DoanCan

+0

另外我還以爲我值得一提的是,當我創建表定義(對於函數)我回顧了視圖列以確保它們實際上是相同的 – jd11

回答

0

的解決辦法是,以確保在功能和兩個視所有列是同一類型進行一次一切都按預期。