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

Sql server e SELECT语句并用INSERT替换它。 或者,如果您必须在SELECT和INSERT语句中使用SELECT语句,则CTE可能不适合该用例,或者您将需要包括SELECT和INSERT语句的CTE定义。,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,您只能在为其定义的语句中使用CTE。在本例中,您有CTE定义和一个SELECT语句来读取CTE 然后,您有一个完全独立的语句,它尝试再次读取插入的CTE。这是不允许的,因为CTE不存在于第二个查询的上下文中。因此,从INSERT语句的角度来看,CTE不存在。我相信你会收到这样的信息: 消息208,级别16,状态1,第[x]行无效的对象名称“cte” 去掉SELECT语句并用INSERT替换它。 或者,如果您必须在SELECT和INSERT语句中使用SELECT语句,则CTE可能不适合该用例,或者

您只能在为其定义的语句中使用CTE。在本例中,您有CTE定义和一个SELECT语句来读取CTE

然后,您有一个完全独立的语句,它尝试再次读取插入的CTE。这是不允许的,因为CTE不存在于第二个查询的上下文中。因此,从INSERT语句的角度来看,CTE不存在。我相信你会收到这样的信息:

消息208,级别16,状态1,第[x]行无效的对象名称“cte”

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

“不起作用”?你有足够的声誉知道这是没有帮助的。你在你的CTE之后,但在你的
INSERT
之前,填充了一个完整的新括号
SELECT
查询。要么你想让它成为第二个CTE(
,另一个CTE AS(
),要么你想完全做别的事情,从上下文看不清楚是什么。“不起作用”?您有足够的声誉知道这是没有帮助的。您在CTE之后但在插入之前填充了一个完整的新括号
SELECT
查询。您希望这是第二个CTE(
,其他(
或者您想做一些完全不同的事情,但从上下文看不清楚是什么。@PittsburghDBA因此正在阅读CTE。它仍然不是插入的一部分。这句话在语义上可能是正确的,但您的“它应该可以正常工作”这句话这不是真的,因为INSERT上没有CTE,所以不管数据类型或其他不相关的事情,它都没有机会正常工作。@PittsburghDBA不想与你争论我不是想争论;我只是反对没有分析的答案来得如此之快。这是不可能的:Statement1:(CTE/SELECT)语句2:(插入/从不存在的CTE中选择),并声明语句2应该有效。@PittsburghDBA仍然不会与您争论。如果INSERT中的列与CTE匹配,这是一个有效的语句。@PittsburghDBA因此它正在读取CTE。它仍然不是INSERT的一部分。该语句可能在语义上正确,但您的语句是“它应该工作得很好“这不是真的,因为插页上没有CTE,所以无论数据类型或其他无关事项如何,它都没有机会正常工作。@匹兹堡广播公司不打算与您争论我不是想争论;我只是反对没有分析的答案来得如此之快。不可能有这样的方法:陈述1:(CTE/SELECT)语句2:(插入/选择不存在的CTE),并声称语句2应该起作用。@PittsburghDBA仍然不会与您争论。如果插入中的列与CTE匹配,这是一个有效的语句。@Cetin Basoz,起作用了!我知道是这样的!非常感谢!!@Cetin Basoz,起作用了!我知道是这样的!非常感谢!!!!
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
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;
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