ตาราง SQL Server: อะไรคือความแตกต่างระหว่าง @, # และ ##?


คำตอบ:


115

#table หมายถึงตารางชั่วคราวในเครื่อง (มองเห็นได้เฉพาะผู้ใช้ที่สร้าง)

##table หมายถึงตารางชั่วคราวส่วนกลาง (ผู้ใช้ทุกคนมองเห็นได้)

@variableName หมายถึงตัวแปรที่สามารถเก็บค่าได้ขึ้นอยู่กับประเภทของมัน


32
คำจำกัดความของ #table ของคุณไม่ถูกต้องทั้งหมด ไม่ จำกัด เฉพาะผู้ใช้ แต่เป็นการเชื่อมต่อ หากผู้ใช้มีการเชื่อมต่อหลายรายการจะมองเห็นได้เฉพาะการเชื่อมต่อที่สร้าง # ตารางในตอนแรก
Davin Studer

@DavinStuder ได้เสนอคำชี้แจงที่สำคัญ ความแตกต่างระหว่างตารางที่ผู้ใช้มองเห็นกับตารางที่มองเห็นได้เฉพาะในการเชื่อมต่อปัจจุบันเป็นสิ่งสำคัญมาก
mirzmaster

@DavinStuder วิธีดูการเชื่อมต่อหลายสำหรับผู้ใช้? สตริงการเชื่อมต่อเดียวกันหรือไม่
Kiquenet

24

4
ฉันรู้ว่านี่เป็นเวลานานแล้ว แต่เนื่องจากนี่เป็นคำตอบแบบลิงก์เท่านั้น (และลิงก์แรกตายแล้ว) สามารถอัปเดตด้วยประเด็นหลักจากแต่ละลิงก์ได้หรือไม่
Mike Guthrie

7

#และ##ตารางเป็นตารางจริงที่แสดงในฐานข้อมูลชั่วคราว ตารางเหล่านี้สามารถมีดัชนีและสถิติและสามารถเข้าถึงได้ข้าม sprocs ในเซสชัน (ในกรณีของตารางชั่วคราวทั่วโลกจะมีให้เลือกระหว่างเซสชัน)

@table เป็นตัวแปรตาราง

สำหรับข้อมูลเพิ่มเติม: http://www.sqlteam.com/article/tem Contemporary-tables


4
และตัวแปรตารางจะอาศัยอยู่ในฐานข้อมูล tempDB ด้วยหากขนาดของมันใหญ่เกินไปที่จะเก็บไว้ในหน่วยความจำ
marc_s

5

ฉันจะเน้นที่ความแตกต่างระหว่าง #table และ @table ## table เป็นตารางชั่วคราวทั่วโลกและเป็นเวลากว่า 10 ปีของการใช้ SQL Server ฉันยังไม่พบกรณีการใช้งานที่ถูกต้อง ฉันแน่ใจว่ามีอยู่บ้าง แต่ธรรมชาติของวัตถุทำให้ IMHO ใช้งานไม่ได้อย่างมาก

การตอบสนองต่อ @whiner โดย @marc_s นั้นเป็นความจริงอย่างแน่นอนมันเป็นตำนานที่แพร่หลายว่าตัวแปรตารางจะอยู่ในหน่วยความจำเสมอ เป็นเรื่องปกติที่ตัวแปรตารางจะไปที่ดิสก์และทำงานเหมือนกับตารางชั่วคราว

อย่างไรก็ตามฉันขอแนะนำให้อ่านชุดของความแตกต่างโดยทำตามลิงก์ที่ระบุโดย @Astander ความแตกต่างส่วนใหญ่เกี่ยวข้องกับข้อ จำกัด ในสิ่งที่คุณไม่สามารถทำได้กับตัวแปร @table


ฉันมีกระบวนงานที่จัดเก็บแยกกัน 5 ขั้นตอนซึ่งดำเนินการส่วนต่างๆของการคำนวณและแสดงผลลัพธ์เดียว สำหรับการตรวจสอบฉันต้องการดูค่ากลางและผู้สอบบัญชีก็เช่นกัน ฉันปรับขั้นตอนของฉันเพื่อถ่ายโอนข้อมูลบางส่วนไปยังตาราง ## Temp เพื่อให้เราสามารถดูทั้งคู่ได้ แต่จะไม่ถูกเก็บรักษาไว้ (จำเป็นในระหว่างการตรวจสอบเท่านั้น) มีกรณีการใช้งานที่ถูกต้องสำหรับคุณ (IMHO!)
RyanfaeScotland

@Ryan เหตุใด ## Table จึงถูกต้องเมื่อคุณสามารถใช้ dbo.Table ได้? ฉันไม่ถือว่าเป็นกรณีการใช้งานที่ถูกต้องเมื่อคุณทำสิ่งที่คุณทำเสร็จแล้วจะช่วยตัวเองจากการพิมพ์คำสั่ง DROP
Aaron Bertrand

4
ฉันไม่ต้องการให้สิทธิ์ผู้ตรวจสอบ DROP บนฐานข้อมูลของฉัน ฉันยังไม่ต้องการที่จะต้องกลับมาจัดระเบียบหลังจากที่เขาทำเสร็จแล้ว ด้วยตารางชั่วคราวเขาสามารถเรียกใช้แบบสอบถามได้บ่อยเท่าที่ต้องการและฉันรู้ว่าเมื่อเขาทำเสร็จแล้วเขาจะไม่ทิ้งรอยเท้าไว้ในฐานข้อมูล
RyanfaeScotland

4
CREATE TABLE #t

สร้างตารางที่มองเห็นได้เฉพาะในและระหว่างนั้น CONNECTION ผู้ใช้คนเดียวกันที่สร้างการเชื่อมต่ออื่นจะไม่สามารถเห็นตาราง #t จากการเชื่อมต่ออื่น

CREATE TABLE ##t

สร้างตารางชั่วคราวที่มองเห็นได้สำหรับการเชื่อมต่ออื่น ๆ แต่ตารางจะหลุดเมื่อการสร้างการเชื่อมต่อสิ้นสุดลง


SqlConnection.Open()กับสตริงการเชื่อมต่อเดียวกันคือการเชื่อมต่อเดียวกัน ?
Kiquenet

2
ไม่มันเป็นการเชื่อมต่อกับฐานข้อมูลเดียวกัน แต่แทบจะไม่ใช่การเชื่อมต่อเดียวกัน
Markus

0

หากคุณต้องการตารางชั่วคราวส่วนกลางที่ไม่ซ้ำใครให้สร้างของคุณเองด้วย Uniqueidentifier Prefix / Suffix และวางการดำเนินการโพสต์หาก object_id (.... ข้อเสียเปรียบเพียงอย่างเดียวคือการใช้ Dynamic sql และจำเป็นต้องลดลงอย่างชัดเจน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.