2011-01-31 27 views
5

Tôi đang gặp lỗi "Lỗi định danh nhiều phần không thể bị ràng buộc" trên một quy trình được lưu trữ mà tôi hiện đang làm việc. Tôi có một số câu hỏi liên quan đến truy vấn bên dưới.Điều khoản đầu ra: Mã định danh nhiều phần không thể bị ràng buộc

  1. Tại sao tôi gặp phải lỗi này?
  2. Tại sao lỗi này xảy ra vào ImportFundingDateTime thay vì FloorplanId do cả hai đều đến từ cùng một truy vấn, nhưng FloorplanId được liệt kê đầu tiên trong mệnh đề đầu ra?
  3. Tôi có thể điều chỉnh truy vấn này để không gặp lỗi trong khi vẫn giữ cấu trúc chung giống nhau không?

.

DECLARE @Results    Table(
    [FloorPlanId]    UNIQUEIDENTIFIER, 
    [ImportFundingDateTime]  DATETIME, 
    [TimeStamp]     VARBINARY(8), 
    [BusinessId]    UNIQUEIDENTIFIER 
    ) 

UPDATE CacRecord 
    SET MatchFound = 1 
    OUTPUT fp.[FloorplanId], cr.[ImportFundingDateTime], 
      fp.[TimeStamp], buyer.[BusinessId] 
    INTO @Results( [FloorplanId], [ImportFundingDateTime], 
        [TimeStamp], [BusinessId]) 
    FROM CacRecord cr WITH (NOLOCK) 
    INNER JOIN CacBatch cb WITH (NOLOCK) 
     ON cr.CacBatchId = cb.CacBatchId 
    INNER JOIN Floorplan fp WITH (NOLOCK) 
     ON fp.UnitVIN = cr.ImportVin 
     AND COALESCE(fp.UnitVIN, '') <> '' 
    INNER JOIN Business buyer WITH (NOLOCK) 
     ON buyer.BusinessId = fp.BuyerBusinessId 
    LEFT OUTER JOIN BusinessContact bc WITH (NOLOCK) 
     ON bc.BusinessId = buyer.BusinessId 
    LEFT OUTER JOIN Contact c WITH (NOLOCK) 
     ON c.ContactId = bc.ContactId 
    WHERE cb.CacJobInstanceId = @cacJobInstanceId 
     AND fp.FloorplanStatusId = 1 --Approved 
     AND COALESCE(cr.ImportVin, '') <> '' 
     AND 1 = 
      CASE 
       WHEN cr.ImportFein = buyer.FederalTaxID 
        AND COALESCE(cr.ImportFein, '') <> '' THEN 1 
       WHEN cr.ImportSsn = c.Ssn 
        AND COALESCE(cr.ImportSsn, '') <> '' THEN 1 
       ELSE 0 
      END; 
+0

Nếu bạn chạy các truy vấn sử dụng 'Chọn fp. [FloorplanId], cr. [ImportFundingDateTime], fp. [Timestamp], người mua. [BusinessID]' và bạn Từ và Trường khoản, nó thực thi mà không lỗi? – Thomas

Trả lời

6

Hãy kiểm tra lại cú pháp của mệnh đề OUTPUT OUTPUT on MSDN

Syntax 

<column_name> ::= 
{ DELETED | INSERTED | from_table_name } . { * | column_name } 

from_table_name 

Is a column prefix that specifies a table included in the FROM clause 
of a DELETE or UPDATE statement that is used tospecify the rows to 
update or delete. 

Dường như bạn đã aliased CacRecord trong mệnh đề FROM là "cr", nhưng chưa tương quan với điều khoản UPDATE.

Note: Ngay cả với nó là bí danh trong mệnh đề FROM và KHÔNG aliased trong sự UPDATE, SQL Server dường như nhận ra CacRecord như bảng UPDATE, đòi hỏi bạn phải sử dụng INSERTED thay vì cr như tên bảng ảo.

UPDATE cr 
SET MatchFound = 1 
OUTPUT fp.[FloorplanId], INSERTED.[ImportFundingDateTime], 
    fp.[TimeStamp], buyer.[BusinessId] 
INTO @Results([FloorplanId], [ImportFundingDateTime], 
    [TimeStamp], [BusinessId]) 
FROM CacRecord cr WITH (NOLOCK) 
INNER JOIN CacBatch cb WITH (NOLOCK) 
ON cr.CacBatchId = cb.CacBatchId 
INNER JOIN Floorplan fp WITH (NOLOCK) 
ON fp.UnitVIN = cr.ImportVin 
AND COALESCE(fp.UnitVIN, '') <> '' 
INNER JOIN Business buyer WITH (NOLOCK) 
ON buyer.BusinessId = fp.BuyerBusinessId 
LEFT OUTER JOIN BusinessContact bc WITH (NOLOCK) 
ON bc.BusinessId = buyer.BusinessId 
LEFT OUTER JOIN Contact c WITH (NOLOCK) 
ON c.ContactId = bc.ContactId 
WHERE cb.CacJobInstanceId = @cacJobInstanceId 
AND fp.FloorplanStatusId = 1 --Approved 
AND COALESCE(cr.ImportVin, '') <> '' 
AND 1 = 
    CASE 
    WHEN cr.ImportFein = buyer.FederalTaxID 
    AND COALESCE(cr.ImportFein, '') <> '' THEN 1 
    WHEN cr.ImportSsn = c.Ssn 
    AND COALESCE(cr.ImportSsn, '') <> '' THEN 1 
    ELSE 0 
    END; 

Đối với du khách đến câu hỏi này, mã này khối cho thấy nhiều bảng được tham chiếu trong mệnh đề OUTPUT một cách chính xác.

create table TO1 (id int, a int); 
create table TO2 (id int, b int); 
create table TO3 (id int, c int); 
insert into TO1 select 1,1; 
insert into TO2 select 1,2; 
insert into TO3 select 1,3; 
insert into TO3 select 1,4; 

declare @catch table (a int, b int, c int) 
update c 
set c = a.a 
output a.a, b.b, INSERTED.c 
into @catch(a,b,c) 
from TO1 a 
inner join TO2 b on a.id=b.id 
inner join TO3 c on a.id=c.id 
+0

Các trường chắc chắn tồn tại trong các bảng được tham chiếu. Tôi đã xác nhận chính tả về chúng. –

+1

@please xem câu trả lời được cập nhật – RichardTheKiwi

+0

Thay đổi câu hỏi để nói "Cập nhật cr" cung cấp cùng một lỗi chính xác. –

Các vấn đề liên quan