无法绑定多部分标识符“TAGRET.Name”

问题描述 投票:0回答:1

运行以下命令时出现错误“无法绑定多部分标识符“TAGRET.Name”。”当我双击 SSMS 中的错误时,它会转到

TAGRET.Name = SOURCE.ParameterName
行。为什么 TARGET 是现有表或者是有错误的源?

我的 CTE 的各个组件都很好。 我也尝试过使用源而不是 CTESource (SELECT * FROM CTESource)。 那么我的语法错误吗?

注意:dbo.sn_.. 暗示同义词,如果这可能是一些文本排序问题?

;WITH CTE1 As (
    SELECT s.ReportDefinitionId, s.FileName, r.Id as BusinessPartnerReportAutomationId, p.Name, p.Value
    FROM sgfi.BusinessPartnerReportAutomation r
        JOIN sgfi.BusinessPartnerReportAutomationSSRSReport s ON s.Id = r.SSRSReportId
        LEFT JOIN sgfi.BusinessPartnerReportAutomationParameters p ON r.Id = p.BusinessPartnerReportAutomationId
    WHERE r.BusinessPartnerId = 0 and s.ReportDefinitionId IN (1000)--, 1003, 1015, 1011)
),CTE2 AS (
    SELECT  
        d.Id as ReportDefinitionId, d.Name as ReportName, d.DataSource,
        p.Name as ParameterName, p.DisplayName as DisplayName,
        m.SSRSDataType as DataType,
        p.DefaultValue as ParameterValue
    FROM (
        SELECT Id, Name, DataSource = REPLACE(REPLACE(DataSource, '[', ''), ']', '')
        FROM dbo.sn_ReportDefinition
        ) d
        JOIN dbo.sn_ReportParameter p ON p.ReportDefinition_Id = d.Id
        LEFT JOIN dbo.sn_ReportSSRSDataTypeMapping m ON m.ReportFieldDataType_Id = p.ReportFieldDataType_Id
    WHERE d.DataSource LIKE 'rptd.%'
    --ORDER BY d.Name, p.Id
), CTESource AS (
    SELECT a.BusinessPartnerReportAutomationId, a.FileName, a.Name, b.ParameterName,
        CASE WHEN b.DataType = 'DateTime' THEN
            CASE b.ParameterName
                WHEN 'FromDate' THEN '=CONVERT(varchar, sgfi.udf_GetFirstDayOfPreviousMonth(GETDATE()), 103) as [Value]'
                WHEN 'ToDate' THEN '=CONVERT(varchar, sgfi.udf_GetLastDayOfPreviousMonth(GETDATE()), 103) as [Value]'
                ELSE b.ParameterValue
            END 
            ELSE
                b.ParameterValue
            END as ParameterValue
        --a.ReportDefinitionId, b.ReportDefinitionId, b.Name, a.Name
    FROM CTE1 a
        JOIN CTE2 b ON b.ReportDefinitionId = a.ReportDefinitionId
    
    WHERE b.ParameterName IS NOT NULL AND (a.Name = b.ParameterName OR a.Name IS NULL)
)
MERGE sgfi.BusinessPartnerReportAutomationParameters as TARGET
USING CTESource as SOURCE
ON (TARGET.BusinessPartnerReportAutomationId = SOURCE.BusinessPartnerReportAutomationId AND 
    TAGRET.Name = SOURCE.ParameterName)
WHEN NOT MATCHED by TARGET THEN
    INSERT (BusinessPartnerReportAutomationId, Name, Value)
    VALUES (SOURCE.BusinessPartnerReportAutomationId, SOURCE.ParameterName, SOURCE.ParameterValue)
WHEN MATCHED AND (
    TARGET.Value IS NULL AND SOURCE.ParameterValue IS NOT NULL
    OR
    TARGET.Value IS NOT NULL AND SOURCE.ParameterValue IS NULL
    OR
    TARGET.Value <> SOURCE.ParameterValue
    ) THEN
    UPDATE SET TARGET.Value = SOURCE.ParameterValue
OUTPUT $action,
DELETED.Id as TargetParmeterId,
DELETED.BusinessPartnerReportAutomationId as TargetBusinessPartnerReportAutomationId,
DELETED.Name as TargetParameterName,
DELETED.Value as TargetParameterValue,
INSERTED.Id as TargetParmeterId,
INSERTED.BusinessPartnerReportAutomationId as TargetBusinessPartnerReportAutomationId,
INSERTED.Name as TargetParameterName,
INSERTED.Value as TargetParameterValue
;
SELECT @@ROWCOUNT as NrRowChanges;
t-sql merge common-table-expression
1个回答
0
投票

啊,从这个意义上来说,TARGET 是一个保留字! 我使用 [TARGET] 或 trg 来获得更好的别名,并且它有效。

© www.soinside.com 2019 - 2024. All rights reserved.