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의 내용이 동일합니다 -이 결과 집합이 JOINs에 추가로 적용될 때 문제가 발생합니다. @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)
)
여기 정의이다
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에서보기
나는 하나의 칼럼이 다르다는 것을 알아 차 렸습니다. 그래서 그것을 편집하고 제가 어떻게되는지보십시오.
보기를 기능으로 변경 한 후 모든 열이 올바른 데이터 형식으로 반환되는지 확인 했습니까? @ResultSet의 일부 열에 대해 소수점과 소수 자릿수를 사용하고있는 것을 볼 수 있습니다. 따라서 함수에서 반환 한 후 일부 데이터가 손실되는 경우 일부 매개 변수에 대해서는보기와 비교하지 않았으므로 조인 중 하나가 실패 할 수 있습니다 당신은 합병과 다른 결과를 얻을 수도 있습니다. 비교를 위해 뷰와 함수를 추가 할 수 있습니까? – DoanCan
또한 내가 (테이블에 대한 정의를 만들 때 언급할만한 가치가 있다고 생각했다.) 함수의 경우 뷰 열을 검토하여 실제로 동일한지를 확인했다. – jd11