'Số nhận dạng nhiều phần' là gì và tại sao nó không thể bị ràng buộc?


136

Tôi liên tục nhận được các lỗi này khi tôi cố gắng cập nhật các bảng dựa trên một bảng khác. Tôi cuối cùng đã viết lại truy vấn, thay đổi thứ tự tham gia, thay đổi một số nhóm và cuối cùng nó hoạt động, nhưng tôi hoàn toàn không nhận được nó.

'Định danh đa phần' là gì?
Khi nào 'số nhận dạng nhiều phần' không thể bị ràng buộc?
Nó đang bị ràng buộc với cái gì?
Trong trường hợp nào lỗi này sẽ xảy ra?
Những cách tốt nhất để ngăn chặn nó là gì?

Lỗi cụ thể từ SQL Server 2005 là:

Mã định danh đa phần "..." không thể bị ràng buộc.

Đây là một ví dụ:

UPDATE  [test].[dbo].[CompanyDetail]

SET Mnemonic = [dbBWKMigration].[dbo].[Company].[MNEMONIC], 
               [Company Code] = [dbBWKMigration].[dbo].[Company].[COMPANYCODE]

WHERE [Company Name] = **[dbBWKMigration].[dbo].[Company].[COMPANYNAME]**

Lỗi thực tế:

Msg 4104, Cấp 16, Trạng thái 1, Dòng 3 Định danh nhiều phần "dbBWKMigration.dbo.Company.COMPANYNAME" không thể bị ràng buộc.

Câu trả lời:


101

Mã định danh nhiều phần là bất kỳ mô tả nào về một trường hoặc bảng có chứa nhiều phần - ví dụ MyTable.SomeRow - nếu không thể bị ràng buộc, điều đó có nghĩa là có gì đó không ổn - hoặc bạn đã mắc lỗi đánh máy đơn giản hoặc nhầm lẫn giữa bảng và cột. Nó cũng có thể được gây ra bằng cách sử dụng các từ dành riêng trong tên bảng hoặc trường của bạn và không bao quanh chúng với []. Nó cũng có thể được gây ra bởi không bao gồm tất cả các cột cần thiết trong bảng đích.

Một cái gì đó như dấu nhắc redgate sql là tuyệt vời để tránh phải gõ thủ công (nó thậm chí tự động hoàn thành các phép nối dựa trên khóa ngoại), nhưng không miễn phí. Máy chủ SQL 2008 hỗ trợ intellisense ra khỏi hộp, mặc dù nó không hoàn toàn như phiên bản redgate.


6
Vẫn thực tế: gợi ý đánh máy của bạn đã lưu ngày của tôi.
Stefan

Nhận xét tiết kiệm trong ngày cho người mới: chỉ cần kiểm tra lỗi đánh máy của bạn, đôi khi nó xảy ra khi bạn thiếu một mẩu nhỏ. Trong vấn đề của tôi, đó là OBJECT_ID (Schema.Table) mà không có bất kỳ trích dẫn nào trong truy vấn 50 dòng.
Abdullah Ilgaz

57

Thực tế đôi khi bạn đang cập nhật một bảng từ dữ liệu của bảng khác, tôi nghĩ một trong những vấn đề phổ biến gây ra lỗi này là khi bạn sử dụng chữ viết tắt của bảng không chính xác hoặc khi không cần thiết . Phát biểu đúng dưới đây:

Update Table1
Set SomeField = t2.SomeFieldValue 
From Table1 t1 
Inner Join Table2 as t2
    On t1.ID = t2.ID

Lưu ý rằng SomeFieldcột từ Bảng1 không có t1vòng loại như t1.SomeFieldnhưng chỉ là SomeField.

Nếu một người cố gắng cập nhật nó bằng cách chỉ định t1.SomeFieldcâu lệnh sẽ trả về lỗi đa phần mà bạn đã nhận thấy.


3
Thêm bí danh bảng ở phía trước Đặt trường gây ra vấn đề này trong trường hợp của tôi.
Malhaar Punjabi

1
Đây là vấn đề của tôi là tốt. Tôi đã có SET ABBREVIATION.My_Field, khi tôi cần SET.My_Field;
VSO

Tôi đã chạy đến lỗi này trong khi sử dụng OPENJSON. `TỪ quyền giám sát c NGOÀI ỨNG DỤNG OPENJSON (mã xác nhận) Các lỗi đã xảy ra. `TỪ quyền giám hộ c OUTER ỨNG DỤNG OPENJSON (c.Địa chỉ)` đã trả lại kết quả
Shaakir

Bạn có thể tìm thấy lời giải thích từ sqlservertutorial.net/sql-server-basics/sql-server-update-join hữu ích:
CAtoOH

17

Nó có lẽ là một lỗi đánh máy. Tìm kiếm các vị trí trong mã của bạn nơi bạn gọi [lược đồ]. [Tên bảng] (về cơ bản là bất cứ nơi nào bạn tham chiếu một trường) và đảm bảo mọi thứ được viết đúng chính tả.

Cá nhân, tôi cố gắng tránh điều này bằng cách sử dụng bí danh cho tất cả các bảng của mình. Nó giúp ích rất nhiều khi bạn có thể rút ngắn tên bảng dài thành từ viết tắt của mô tả của nó (ví dụ WorkOrderParts -> WOP), và cũng làm cho truy vấn của bạn dễ đọc hơn.

Chỉnh sửa: Là một phần thưởng bổ sung, bạn sẽ lưu TẤN các tổ hợp phím khi tất cả những gì bạn phải nhập là bí danh ba hoặc bốn chữ cái so với tên lược đồ, bảng và trường cùng nhau.


6

Binding = biểu diễn văn bản của bạn về một cột cụ thể được ánh xạ tới một cột vật lý trong một số bảng, trong một số cơ sở dữ liệu, trên một số máy chủ.

Mã định danh nhiều phần có thể là: MyDatabase.dbo.MyTable. Nếu bạn nhận được bất kỳ số nhận dạng nào sai, thì bạn có một số nhận dạng nhiều phần không thể ánh xạ.

Cách tốt nhất để tránh nó là viết truy vấn ngay lần đầu tiên hoặc sử dụng plugin cho studio quản lý cung cấp intellisense và do đó giúp bạn thoát khỏi lỗi chính tả.


5

Bạn có thể có một lỗi đánh máy. Ví dụ: nếu bạn có một bảng có tên là Khách hàng trong cơ sở dữ liệu có tên là Sales, bạn có thể gọi nó là Sales..Customer (mặc dù tốt hơn là tham chiếu đến nó bao gồm tên chủ sở hữu (dbo là chủ sở hữu mặc định) như Sales.dbo .Khách hàng.

Nếu bạn đã nhập Bán hàng ... Khách hàng, bạn có thể đã nhận được tin nhắn bạn nhận được.


4

Nếu bạn chắc chắn rằng nó không phải là một lỗi chính tả, có lẽ nó là một lỗi chính tả.

Đối chiếu gì bạn đang sử dụng? Kiểm tra nó.


4

Khi cập nhật bảng, đảm bảo bạn không tham chiếu trường cập nhật của mình qua bí danh.

Tôi chỉ gặp lỗi với đoạn mã sau

update [page] 
set p.pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

Tôi đã phải xóa tham chiếu bí danh trong câu lệnh set để nó đọc như thế này

update [page] 
set pagestatusid = 1
from [page] p
join seed s on s.seedid = p.seedid
where s.providercode = 'agd'
and p.pagestatusid = 0

4

Tôi thấy rằng tôi nhận được những thứ này rất nhiều khi tôi cố gắng viết tắt, chẳng hạn như:

Table1 t1, Table2 t2 
where t1.ID = t2.ID

Thay đổi nó thành:

Table1, Table2 
where Table1.ID = Table2.ID

Làm cho truy vấn hoạt động và không ném lỗi.


3

Mã lỗi

FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID =dbo.SubModule.subModuleID 

Mã giải pháp

 FROM                
    dbo.Category C LEFT OUTER JOIN           
    dbo.SubCategory SC ON C.categoryID = SC.CategoryID AND C.IsActive = 'True' LEFT OUTER JOIN          
    dbo.Module M ON SC.subCategoryID = M.subCategoryID AND SC.IsActive = 'True' LEFT OUTER JOIN          
    dbo.SubModule SM ON M.ModuleID = SM.ModuleID AND M.IsActive = 'True' AND SM.IsActive = 'True' LEFT OUTER JOIN 
    dbo.trainer ON dbo.trainer.TopicID = SM.subModuleID 

như bạn có thể thấy, trong mã lỗi, dbo.SubModuleđã được xác định là SM, nhưng tôi đang sử dụng dbo.SubModuleở dòng tiếp theo, do đó đã xảy ra lỗi. sử dụng tên khai báo thay vì tên thực tế. Vấn đề được giải quyết.


2

Tôi đã có vấn đề này và hóa ra đó là một bí danh bảng không chính xác. Sửa lỗi này đã giải quyết vấn đề.


2

Của tôi đã đặt lược đồ trên bảng Bí danh do nhầm lẫn:

SELECT * FROM schema.CustomerOrders co
WHERE schema.co.ID = 1  -- oops!

2

Thêm bí danh bảng ở phía trước Đặt trường gây ra vấn đề này trong trường hợp của tôi.

Đúng Bảng cập nhật phải1 Đặt someField = t2.SomeFieldValue Từ bảng1 t1 Tham gia bên trong Bảng2 dưới dạng t2 Trên t1.ID = t2.ID

Cập nhật sai Bảng1 Đặt t1.SomeField = t2.SomeFieldValue Từ Bảng1 t1 Tham gia bên trong Bảng2 là t2 Trên t1.ID = t2.ID


1

Tôi đã có P.PayeeName AS 'Payer' --, và hai dòng bình luận đã ném lỗi này


1

Tôi thực sự đã quên tham gia bàn với những người khác đó là lý do tại sao tôi gặp lỗi

Được cho là theo cách này:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation, dbo.Flight
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum =562)

Và không phải theo cách này:

  CREATE VIEW reserved_passangers AS
  SELECT dbo.Passenger.PassName, dbo.Passenger.Address1, dbo.Passenger.Phone
  FROM dbo.Passenger, dbo.Reservation
  WHERE (dbo.Passenger.PassNum = dbo.Reservation.PassNum) and
  (dbo.Reservation.Flightdate = 'January 15 2004' and Flight.FlightNum = 562)

1

Lời khuyên tốt nhất của tôi khi gặp lỗi là sử dụng [] braquets để sorround tên bảng, viết tắt của bảng gây ra đôi khi lỗi, (đôi khi viết tắt bảng chỉ hoạt động tốt ... kỳ lạ)


1

Tôi đã nhận được lỗi này và chỉ không thể thấy vấn đề ở đâu. Tôi đã kiểm tra lại tất cả các bí danh và cú pháp của mình và không có gì nhìn không đúng chỗ. Các truy vấn tương tự như những gì tôi viết tất cả các thời gian.

Tôi quyết định chỉ viết lại truy vấn (ban đầu tôi đã sao chép nó từ tệp báo cáo .rdl) bên dưới, một lần nữa và nó chạy tốt. Nhìn vào các truy vấn bây giờ, chúng trông giống tôi, nhưng một bài viết lại của tôi hoạt động.

Chỉ muốn nói rằng nó có thể đáng giá nếu không có gì khác làm việc.


1

Khi bạn gõ bảng TỪ, các lỗi đó sẽ biến mất. Nhập TỪ bên dưới những gì bạn gõ thì Intellisense sẽ hoạt động và định danh đa phần sẽ hoạt động.


0

Tôi đã đối mặt với vấn đề này và giải quyết nó nhưng có một sự khác biệt giữa mã của bạn và của tôi. Mặc dù tôi nghĩ bạn có thể hiểu thế nào là "định danh đa phần không thể bị ràng buộc"

Khi tôi sử dụng mã này

 select * from tbTest where email = sakira@gmail.com

Tôi phải đối mặt với vấn đề định danh nhiều phần

nhưng khi tôi sử dụng một trích dẫn cho địa chỉ email

 select * from tbTest where email = 'sakira@gmail.com'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.