BUG: ข้อผิดพลาด 16929 "เคอร์เซอร์เป็นอ่านอย่างเดียว" สำหรับ w/OpenQuery() เคอร์เซอร์

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 197392 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
bug #: 35132 (sqlbug_70)
bug #: 35132 (shiloh_bug)
ขยายทั้งหมด | ยุบทั้งหมด

อาการ

การปรับปรุงตารางระยะไกลโดยใช้คำสั่ง UPDATE ซึ่งปัจจุบันความบนเคอร์เซอร์ที่เปิด ด้วยไวยากรณ์ OpenQuery() ล้มเหลว ด้วยข้อความแสดงข้อผิดพลาดต่อไปนี้:
msg 16929 ระดับ 16 สถานะ 1
มีเคอร์เซอร์อ่านเท่านั้น
เคอร์เซอร์ยังอาจล้มเหลวขณะประกาศถ้ามีใช้อนุประโยคของ FOR UPDATE

สาเหตุ

เคอร์เซอร์แบบคงที่เป็นกำลังสร้าง ด้วยไวยากรณ์ OpenQuery()

การหลีกเลี่ยงปัญหา

เมื่อต้องการแก้ไขปัญหานี้ เลือกทำอย่างใดอย่างหนึ่งต่อไปนี้:
  • ใช้เคอร์เซอร์ชุดคีย์ (SCROLL) กับแผนการตั้งชื่อส่วน 4 แทน ด้วยไวยากรณ์ OpenQuery() ซึ่งต้องต่อไปนี้:

    • ผู้ให้บริการ OLE DB ระยะไกลต้องรองรับการ ITransactionJoin อินเทอร์เฟซ
    • Microsoft แจกจ่ายธุรกรรม Coordinator (DTC) ต้องทำงานบนเซิร์ฟเวอร์ในระบบ
    • การดำเนินการเคอร์เซอร์ต้องสามารถทำได้ภายในธุรกรรมที่มีการเพิ่มระดับการแยก REPEATABLE_READ หรือ SERIALIZABLE
    หรือ
  • ทำการปรับปรุงโดยตรงไปยังตารางแทนที่มีการปรับปรุงถึงเคอร์เซอร์ เมื่อต้องการทำเช่นนี้ คุณสามารถเปิดเคอร์เซอร์ไปยังคีย์ที่ไม่ซ้ำกันในตารางที่นำมาใช้ และดำเนินการคำสั่ง UPDATE การขึ้นอยู่กับค่าของคีย์นี้ ในตัวอย่างต่อไปนี้:
          declare @i int
          declare curs1 cursor for
          select a from OpenQuery(server1, 'select a from pubs.dbo.ab')
          open curs1
          fetch curs1 into @i
          while @@fetch_status <> -1
          begin
          update openquery(server1, 'select a, b from pubs.dbo.ab')
          set b = 'XXX' where a = @i
          fetch curs1 into @i
          end
          close curs1
          deallocate curs1
          go
    
    						
    โดยที่คอลัมน์ 'เป็น 'เป็นคีย์หลักสำหรับตาราง 'ab' บนเซิร์ฟเวอร์ที่ถูกเชื่อมโยง' server1' คอลัมน์ 'b' อาจคอลัมน์อื่นใด ๆ ในตาราง

    หมายเหตุ: ด้วยวิธีนี้ คุณสามารถใช้แผนการตั้งชื่อที่ 4-ส่วนหรือไวยากรณ์ OpenQuery()

สถานะ

Microsoft ยืนยันว่าปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ซึ่งมีการระบุไว้ในส่วนเริ่มต้นของเอกสารนี้

ข้อมูลเพิ่มเติม

เคอร์เซอร์แบบไดนามิก ไปข้างหน้าอย่างเดียว และเร็วไปข้างหน้าอย่างเดียวรูปไม่ได้รับการสนับสนุนบนแบบสอบถามที่วางจำหน่าย ถ้าคุณร้องขอมีชนิดที่ด้านบนของเคอร์เซอร์ เคอร์เซอร์จะพยายามเปิดเคอร์เซอร์ชุดคีย์ที่เป็นค่าเริ่มต้น หากไม่สนับสนุนเคอร์เซอร์ชุดคีย์สำหรับการสอบถาม เคอร์เซอร์แบบคงที่จะถูกสร้างขึ้น ลักษณะดังกล่าวเป็นสิ่งที่คาดว่าจะเกิด

อย่างไรก็ตาม ถ้าเคอร์เซอร์ชุดคีย์เปิดการใช้ไวยากรณ์ OpenQuery() มันจะไม่ถูกต้องถูก downgraded การเคอร์เซอร์แบบคงที่ ผลลัพธ์สุดท้าย คือ ไม่ว่าชนิดของเคอร์เซอร์จะขอ มีไวยากรณ์ OpenQuery() เคอร์เซอร์แบบคงที่ถูกสร้างขึ้น เนื่องจากเคอร์เซอร์แบบคงที่เป็นแบบอ่านอย่างเดียวนี้ ความพยายามในการปรับปรุงเคอร์เซอร์ใด ๆ จะได้รับข้อความแสดงข้อผิดพลาดที่บันทึกไว้ในส่วนของอาการของบทความนี้

ดูข้อมูลเพิ่มเติมบนเคอร์เซอร์ หัว "เคอร์เซอร์ Declare (T SQL) ข้อในสมุดบัญชีออนไลน์การ SQL Server 7.0

คุณสมบัติ

หมายเลขบทความ (Article ID): 197392 - รีวิวครั้งสุดท้าย: 7 มกราคม 2554 - Revision: 2.0
ใช้กับ
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
Keywords: 
kbbug kbpending kbmt KB197392 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:197392

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com