天天看點

SqlServer自定義函數Function中調用with as

SET QUOTED_IDENTIFIER ON      

 辨別符可以由雙引号分隔,而文字必須由單引号分隔

SET QUOTED_IDENTIFIER OFF      

 辨別符不可加引号,且必須遵守所有 Transact-SQL 辨別符規則。

SET NOCOUNT ON  --傳回受影響的行數      
SET DATEFIRST 1   --定義日期周一開始      
SET ANSI_NULLS ON      

 在與空值進行比較時,允許比較運算符傳回 TRUE 或 FALSE

如果 ColumnA 包含 Null 值,則 ColumnA = NULL 之類的比較操作會傳回 TRUE;
如果 ColumnA 除了包含 NULL 外還包含某些值,則這類比較操作将傳回 FALSE。
比較計算結果為 NULL 的兩個表達式也會傳回 TRUE。
SQL-92 标準要求在對空值進行等于 (=) 或不等于 (<>) 比較時取值為 FALSE。當 SET ANSI_NULLS 為 ON 時,
即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 語句仍傳回零行。
即使 column_name 中包含非空值,使用 WHERE column_name <> NULL 的 SELECT 語句仍會傳回零行。

當 SET ANSI_NULLS 為 OFF 時,等于 (=) 和不等于
(<>) 比較運算符不遵從 SQL-92 标準。使用 WHERE
column_name = NULL 的 SELECT 語句傳回 column_name 中包含空值的行。使用 WHERE
column_name <> NULL 的 SELECT
語句傳回列中包含非空值的行。此外,使用 WHERE column_name
<> XYZ_value 的 SELECT 語句傳回所有不為
XYZ_value 也不為 NULL 的行。      
CREATE FUNCTION  dbo.GetTargetSummaryRefNew
(
@TargetGroupList dbo.GuidList READONLY
)RETURNS
@ TABLE(
TargetDetailID NVARCHAR(36)
  ,pTargetID NVARCHAR(36)
  ,pTargetName NVARCHAR(256)
  ,sTargetID NVARCHAR(36)
  ,sTargetName NVARCHAR(256)
  ,TargetGroupID NVARCHAR(36)
  ,pSummaryType NVARCHAR(64)
  ,ConversionValue DECIMAL(18,8)
  ,pToTargetID NVARCHAR(36)
  ,pIsCalculated INT
)
AS
BEGIN
WITH v_targetdetail(ID,ParentID,TargetID,TargetName,TargetGroupID,ConversionValue,ToTargetID,IsCalculated,IsLeaf,IDFullPath,IsDisplay)
AS
(SELECT p.ID
      ,p.ParentID
      ,ISNULL(p.TargetID,p.ID) TargetID
      ,p.Name TargetName
      ,p.GroupID TargetGroupID
      ,p.ConversionValue
      ,p.ToTargetID
      ,p.IsCalculated
      ,p.IsLeaf
      ,CAST(p.ID AS NVARCHAR(max)) IDFullPath
      ,p.IsDisplay
FROM ToBusinessTargetGroupDetail2(NOLOCK) p
INNER JOIN @TargetGroupList p1 ON p1.[GUID]=p.GroupID
WHERE p.ParentID IS NULL OR p.IsReported=0
UNION ALL
SELECT p.ID
      ,p.ParentID
      ,ISNULL(p.TargetID,p.ID) TargetID
      ,p.Name TargetName
      ,p1.TargetGroupID
      ,p.ConversionValue
      ,p.ToTargetID
      ,p.IsCalculated
      ,p.IsLeaf
      ,CAST(p1.IDFullPath+'.'+p.ID AS NVARCHAR(max)) IDFullPath
      ,p.IsDisplay
FROM ToBusinessTargetGroupDetail2(NOLOCK) p
INNER JOIN v_targetdetail p1 ON p1.ID=p.ParentID AND p1.TargetGroupID=p.GroupID
WHERE p.IsReported=1
)
,v_taregetsummaryref(TargetDetailID,pTargetID,pTargetName,TargetGroupID,sTargetID,sTargetName,ConversionValue,pToTargetID,pIsCalculated,sIsLeaf) 
AS
(
SELECT p.ID
      ,p.TargetID pTargetID
      ,p.TargetName pTargetName
      ,p.TargetGroupID
      ,p1.TargetID sTargetID
      ,p1.TargetName sTargetName
      ,p1.ConversionValue
      ,p.ToTargetID
      ,p.IsCalculated
      ,p1.IsLeaf
      FROM v_targetdetail p
      INNER JOIN v_targetdetail p1 ON p1.TargetGroupID=p.TargetGroupID AND  p1.IDFullPath LIKE p.IDFullPath+'%'
      WHERE p.IsDisplay=1
)

INSERT INTO @t(TargetDetailID,pTargetID,pTargetName,sTargetID,sTargetName,TargetGroupID,ConversionValue,pToTargetID,pIsCalculated)
SELECT TargetDetailID,pTargetID,pTargetName,sTargetID,sTargetName,TargetGroupID,ConversionValue,pToTargetID,pIsCalculated
  FROM v_taregetsummaryref
  UNION ALL 
  SELECT  p1.TargetDetailID
    ,p1.pTargetID
    ,p1.pTargetName
    ,p2.ID sTargetID
    ,p2.Name sTargetName
    ,p1.TargetGroupID
    ,p1.ConversionValue
    ,p1.pToTargetID
    ,p1.pIsCalculated
    FROM dbo.ToFinanceAccount(NOLOCK) p
    INNER JOIN v_taregetsummaryref p1 ON p1.sTargetID=p.ID AND p1.sIsLeaf=1
    INNER JOIN dbo.ToFinanceAccount p2 ON p2.FullPath LIKE p.FullPath+'\%' AND ISNULL(p2.IsDelete,0)=0
    WHERE ISNULL(p.IsDelete,0)=0 AND p.IsLeaf!=1

    UPDATE p 
  SET p.pSummaryType=ISNULL(p1.SummaryType,'Org&Date')
  FROM @t p
  LEFT JOIN ToBusinessTarget2 p1 ON p1.ID=p.pTargetID
  RETURN
end