0

感谢昨天对日期转换提出建议的人,我现在有了一个可以工作的 SELECT 脚本。

不幸的是,当我尝试将其转换为 UPDATE 脚本时,我感到很害怕

Msg 4104, Level 16, State 1, Line 25
The multi-part identifier "mbrProject.ID" could not be bound.

对于每个匹配的 ID (mbrProject.[ID] = ProjectDates.[Project_ID]),整个脚本应将 mbrProject 中的日期插入 ProjectDates,同时在 mbrProject 中解析混合的美国和英国格式日期,因为用户在更新时的国家/地区设置不正确桌子(我不能改变)。

Update ProjectDates
SET ProjectDates.[Start_Date] =

(
select right([Start_Date],4) +  
    case 
        when len([Start_Date])=10 then 
            substring([Start_Date],4,2) + left([Start_Date],2)

        else    right('0' + left([Start_Date],firstIndex-1),2) + 
                right('0' + substring([Start_Date],firstIndex+1,secondIndex - firstIndex-1),2) 
                end

from 
    (
    select mp.[Start_Date], charindex('/',mp.[Start_Date],1) firstIndex,
          charindex('/',mp.[Start_Date],charindex('/',mp.[Start_Date],1)+1) secondIndex

    from mbrProject mp
    join ProjectDates pd
    on mp.ID = pd.Project_ID
    )A

where mbrProject.[ID] = ProjectDates.Project_ID
)

如果我只运行 SELECT 语句,它工作正常,返回正确的值。即一切从

select right([Start_Date],4) +  
    case 

向下

from mbrProject mp
join ProjectDates pd
on mp.ID = pd.Project_ID
)A

但是,一旦我尝试将其包含在 UPDATE 语句中,就会出现错误。

我知道这取决于语法,但是无论我尝试移动什么东西,我都无法弄清楚。

请问有什么想法吗?

谢谢克雷格

4

3 回答 3

0

试试这个:

UPDATE PR
SET PR.[Start_Date] = A.[Corrected_Start_Date]
FROM ProjectDates PR
    JOIN
    (
        SELECT
            [Id],
            RIGHT([Start_Date],4) +  
            CASE
                WHEN len([Start_Date])=10
                THEN substring([Start_Date],4,2) + LEFT([Start_Date],2)
                ELSE RIGHT('0' + LEFT([Start_Date],firstIndex-1),2) + 
                         RIGHT('0' + substring([Start_Date],firstIndex+1,secondIndex - firstIndex-1),2) 
            END [Corrected_Start_Date]
        FROM 
        (
            SELECT
                        [Id],
                        [Start_Date],
                        charindex('/',[Start_Date],1) firstIndex,
                        charindex('/',[Start_Date],charindex('/',[Start_Date],1)+1) secondIndex
            FROM mbrProject
        ) S
    ) A
ON A.[ID] = PR.[Project_ID]
于 2013-01-15T14:50:25.350 回答
0
(
select mp.[Start_Date], charindex('/',mp.[Start_Date],1) firstIndex,
      charindex('/',mp.[Start_Date],charindex('/',mp.[Start_Date],1)+1) secondIndex

from mbrProject mp
join ProjectDates pd
on mp.ID = pd.Project_ID
)A

在此处最后一行的末尾,名称、mp和(内部)不再作为表名或别名存在。从这里开始,唯一适用于该行集的名称是您提供的别名。pdmbrProjectProjectDatesA

所以你需要包含mp.ID在你的选择列表中,然后A.ID在你的外部比较中使用。


另外,不知道您要做什么,我只想确保您知道ProductDates(正在更新的表)并且pd指的是该表的两个独立实例,一个内部实例和一个外部实例。我希望决赛WHERE应该是:

where A.[ID] = ProjectDates.Project_ID
于 2013-01-15T14:51:57.660 回答
0

问题是这样做

Update ProjectDates
SET ProjectDates.[Start_Date] = (select ...)

您正在尝试将一行的一个字段设置为子选择语句的结果,我认为该语句返回多个值。

于 2013-01-15T14:54:11.210 回答