在多部件标识符上更新日期转换失败的表

时间:2013-01-15 14:46:02

标签: sql identifier

感谢昨天有关日期转换建议的人,我现在有了一个有效的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中,同时解析混合的US&英国格式在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语句中,我就会收到错误。

我知道这取决于语法,但无论我在哪里尝试移动内容,我都无法理解它。

有什么想法吗?

由于 克雷格

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

在此处最后一行的末尾,名称mppdmbrProject和(内部ProjectDates)不再作为表名或别名存在。此处适用于此行集的唯一名称是A,即您提供的别名。

因此,您需要在选择列表中加入mp.ID,然后在外部比较中使用A.ID


另外,我不知道你要做什么,我只是想确保你知道ProductDates(正在更新的表格)和{{1}指的是该表的两个独立实例,一个是内部实例,另一个是外部实例。我希望最后的pd应该是:

WHERE

答案 2 :(得分:0)

问题在于做

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

你试图将一行的一个字段设置为子选择语句的结果,我认为这是返回多个值。