Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据fetch cteTable更新特定字段_Sql_Sql Server - Fatal编程技术网

Sql 如何根据fetch cteTable更新特定字段

Sql 如何根据fetch cteTable更新特定字段,sql,sql-server,Sql,Sql Server,我想根据cteTable的结果替换DATEADD函数中的第一个和第二个参数。这可能吗?我需要创建一个参数吗?先谢谢你。新年快乐 ;with cteDP as( SELECT CODE, MEASSUREMENT, DEFEXPIRYDATEDAYS, CASE WHEN MEASSUREMENT = 0 THEN 'DAY' WHEN MEASSUREMENT = 1 THEN 'WEEK' WHEN MEASSUREMENT = 2 THEN 'MONTH' WHEN

我想根据cteTable的结果替换DATEADD函数中的第一个和第二个参数。这可能吗?我需要创建一个参数吗?先谢谢你。新年快乐

;with cteDP as(
SELECT CODE, MEASSUREMENT, DEFEXPIRYDATEDAYS,
CASE WHEN MEASSUREMENT = 0 THEN 'DAY'
    WHEN MEASSUREMENT = 1 THEN 'WEEK'
    WHEN MEASSUREMENT = 2 THEN 'MONTH'
    WHEN MEASSUREMENT = 3 THEN 'YEARS'
    ELSE 'SECOND' 
    END AS MEASUREMENTINWORD
FROM PW001C06 C06 WHERE CODE IN ('ADC','MMC')
)
select * from cteDP

UPDATE P05
SET     P05.EXPIRYDATE =  CASE  
                        WHEN P05.CODE = 'ADC' THEN DATEADD('cteDocProperties.MEASUREMENTINWORD', @2nd parameter, EXPIRYDATE) 
                       -- WHEN P05.CODE = 'MMC' THEN DATEADD(YEAR, 4, EXPIRYDATE) 
                       -- WHEN P05.CODE = 'LD00' THEN DATEADD(YEAR, 3, EXPIRYDATE) 
                        ELSE EXPIRYDATE
                    END 
FROM   PW001P05 P05
       INNER JOIN cteDP
         ON cteDP.CODE = P05.CODE
WHERE  P05.PIN = 1
       AND P05.CODE IN ('ADC','MMC')

您可以直接将联接到表表达式:

UPDATE P05
SET     
    P05.EXPIRYDATE =  CASE  
                        WHEN P05.CODE = 'ADC' THEN 
                           CASE WHEN MEASUREMENTINWORD = 'SECOND' 
                              THEN DATEADD(SECOND, MEASSUREMENT, EXPIRYDATE) 
                           CASE WHEN MEASUREMENTINWORD = 'DAY' 
                              THEN DATEADD(DAY, MEASSUREMENT, EXPIRYDATE) 
                           CASE WHEN MEASUREMENTINWORD = 'MONTH' 
                              THEN DATEADD(MONTH, MEASSUREMENT, EXPIRYDATE) 
                           CASE WHEN MEASUREMENTINWORD = 'YEAR' 
                              THEN DATEADD(YEAR, MEASSUREMENT, EXPIRYDATE) 
                           ELSE EXPIRYDATE
                       END 
FROM   PW001P05 P05
INNER JOIN 
(
   SELECT 
      CODE
      , MEASSUREMENT
      , DEFEXPIRYDATEDAYS
      , CASE 
           WHEN MEASSUREMENT = 0 THEN 'DAY'
           WHEN MEASSUREMENT = 1 THEN 'WEEK'
           WHEN MEASSUREMENT = 2 THEN 'MONTH'
           WHEN MEASSUREMENT = 3 THEN 'YEARS'
           ELSE 'SECOND' 
        END AS MEASUREMENTINWORD
   FROM PW001C06 C06 WHERE CODE IN ('ADC','MMC')
) cteDP
   ON cteDP.CODE = P05.CODE
WHERE  P05.PIN = 1
       AND P05.CODE IN ('ADC','MMC')

我也这么想。嵌套的case语句将完成这项工作。我有20多个代码需要更新。DEFEXPIRYDATEDAYS字段还用于显示年/日/月的数量。所以有3个条件,1个表示代码,1个表示日/月/年,1个表示数量。有没有办法让它正常化?谢谢。@Arvinjohnsalandan其他代码背后的逻辑是什么?它与
code='ADC'
的代码相比有什么不同吗?它与其他代码相同。只要大声想一想,这是可以正常化还是可以循环,这样脚本就可以短得多。@arvinjohnsalandan您最好的选择是像上面这样的查询。
WHILE
循环可能较短,但性能较差。