运行以下命令时出现错误“无法绑定多部分标识符“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;
啊,从这个意义上来说,TARGET 是一个保留字! 我使用 [TARGET] 或 trg 来获得更好的别名,并且它有效。