似乎无法将CTE插入表格中

时间:2018-02-20 16:35:48

标签: sql-server sql-server-2008 tsql

我的cte run find,并给出了我期望的数字,但我似乎无法将结果插入表中。在发布之前,我在网上进行了一些研究,根据我所看到的情况,设置似乎是正确的,但我必须在某个地方错过一些步骤,因为这个脚本不起作用。有人能看到我无法看到的东西吗?我在SQL Server 2008上。

with cte as 
(
select 
       *, rn = row_number() over (partition by Credit_Line_NO order by REVIEW_FREQUENCY)
from TBL_FBNK_LIMIT_HIST
) 

(select CREDIT_LINE_NO
    ,LIMIT_CURRENCY
    ,(CAST(AVAIL_AMT AS DECIMAL(30,15)) * (CAST(SUBSTRING(CUSIP_NO,1,CHARINDEX('%',CUSIP_NO)-1) AS DECIMAL(30,15))/100))/(12/CAST(LEFT(SUBSTRING(REVIEW_FREQUENCY, CHARINDEX('M',review_frequency)+1,LEN(REVIEW_FREQUENCY)),2) AS DECIMAL)) AS AMOUNT
    ,REVIEW_FREQUENCY   
    ,CAST(LEFT(REVIEW_FREQUENCY, 8) AS DATE) AS STARTDATE
    ,CAST(EXPIRY_DATE AS DATE)  AS EXPIRY_DATE
    ,CAST(round((DATEDIFF(MONTH,cast(LEFT(REVIEW_FREQUENCY,8) as DATE),CAST(EXPIRY_DATE AS DATE)))/cast(LEFT(SUBSTRING  (REVIEW_FREQUENCY, CHARINDEX('M',review_frequency)+1,LEN(REVIEW_FREQUENCY)),2) as decimal)+0.4,0) AS INTEGER) AS FREQUENCY  
    ,CAST(DATEADD(MONTH, (rn-1)* LEFT((SUBSTRING(REVIEW_FREQUENCY, CHARINDEX('M',review_frequency)+1,LEN(REVIEW_FREQUENCY))),2),LEFT(REVIEW_FREQUENCY, 8)) AS DATE) AS EFFECTIVESTARTDATE
FROM cte
WHERE AVAIL_AMT NOT LIKE '%]%'
    AND CUSIP_NO IS NOT NULL  
    AND CUSIP_NO <> '0' 
    AND AVAIL_AMT <> '0'
    AND AVAIL_AMT IS NOT NULL)
INSERT TBL_FBNK_LIMIT_HIST_TRANS_SPLIT (CREDIT_LINE_NO,LIMIT_CURRENCY,AMOUNT,REVIEW_FREQUENCY,START_DATE,EXPIRY_DATE,FREQUENCY,AsOfDate,EFFECTIVESTARTDATE)
Select CREDIT_LINE_NO,LIMIT_CURRENCY,AMOUNT,REVIEW_FREQUENCY,START_DATE,EXPIRY_DATE,FREQUENCY,AsOfDate,EFFECTIVESTARTDATE
From cte

谢谢!

3 个答案:

答案 0 :(得分:2)

你并没有真正使用插入中的可爱。试试吧:

with cte as 
(
select 
       *, rn = row_number() over (partition by Credit_Line_NO order by REVIEW_FREQUENCY)
from TBL_FBNK_LIMIT_HIST
), 
cte2 as 
(select CREDIT_LINE_NO
    ,LIMIT_CURRENCY
    ,(CAST(AVAIL_AMT AS DECIMAL(30,15)) * (CAST(SUBSTRING(CUSIP_NO,1,CHARINDEX('%',CUSIP_NO)-1) AS DECIMAL(30,15))/100))/(12/CAST(LEFT(SUBSTRING(REVIEW_FREQUENCY, CHARINDEX('M',review_frequency)+1,LEN(REVIEW_FREQUENCY)),2) AS DECIMAL)) AS AMOUNT
    ,REVIEW_FREQUENCY   
    ,CAST(LEFT(REVIEW_FREQUENCY, 8) AS DATE) AS STARTDATE
    ,CAST(EXPIRY_DATE AS DATE)  AS EXPIRY_DATE
    ,CAST(round((DATEDIFF(MONTH,cast(LEFT(REVIEW_FREQUENCY,8) as DATE),CAST(EXPIRY_DATE AS DATE)))/cast(LEFT(SUBSTRING  (REVIEW_FREQUENCY, CHARINDEX('M',review_frequency)+1,LEN(REVIEW_FREQUENCY)),2) as decimal)+0.4,0) AS INTEGER) AS FREQUENCY  
    ,CAST(DATEADD(MONTH, (rn-1)* LEFT((SUBSTRING(REVIEW_FREQUENCY, CHARINDEX('M',review_frequency)+1,LEN(REVIEW_FREQUENCY))),2),LEFT(REVIEW_FREQUENCY, 8)) AS DATE) AS EFFECTIVESTARTDATE
FROM cte
WHERE AVAIL_AMT NOT LIKE '%]%'
    AND CUSIP_NO IS NOT NULL  
    AND CUSIP_NO <> '0' 
    AND AVAIL_AMT <> '0'
    AND AVAIL_AMT IS NOT NULL)
INSERT TBL_FBNK_LIMIT_HIST_TRANS_SPLIT (CREDIT_LINE_NO,LIMIT_CURRENCY,AMOUNT,REVIEW_FREQUENCY,START_DATE,EXPIRY_DATE,FREQUENCY,AsOfDate,EFFECTIVESTARTDATE)
Select CREDIT_LINE_NO,LIMIT_CURRENCY,AMOUNT,REVIEW_FREQUENCY,START_DATE,EXPIRY_DATE,FREQUENCY,AsOfDate,EFFECTIVESTARTDATE
From cte2;

代码看起来多余,但至少它会以您认为应该的方式工作。

答案 1 :(得分:1)

您只能在定义它的语句中使用CTE。在您的情况下,您具有CTE定义和读取CTE的SELECT语句。

然后,你有一个完全独立的语句,试图再次为INSERT读取CTE。这是不允许的,因为CTE在第二个查询的上下文中不存在。因此,从INSERT语句的角度来看,CTE不存在。我确定你收到了这条消息:

  

Msg 208,Level 16,State 1,Line [x]无效的对象名称'cte'。

删除SELECT语句并将其替换为INSERT。 或者,如果必须在SELECT和INSERT语句中使用SELECT语句,则CTE可能不适合用例,或者您需要包括SELECT和INSERT的CTE定义。

答案 2 :(得分:-1)

它应该正常工作,除非这些列不在TBL_FBNK_LIMIT_HIST_TRANS_SPLIT中或数据类型不匹配。

中间的选择不是插入的一部分。

INSERT TBL_FBNK_LIMIT_HIST_TRANS_SPLIT 
       (CREDIT_LINE_NO, LIMIT_CURRENCY, AMOUNT, REVIEW_FREQUENCY, START_DATE, EXPIRY_DATE, FREQUENCY, AsOfDate, EFFECTIVESTARTDATE)
Select  CREDIT_LINE_NO, LIMIT_CURRENCY, AMOUNT, REVIEW_FREQUENCY, START_DATE, EXPIRY_DATE, FREQUENCY, AsOfDate, EFFECTIVESTARTDATE
From cte