ฉันจะวางตัวแปรตารางใน SQL-Server ได้อย่างไร ฉันควรทำสิ่งนี้หรือไม่?


123

ฉันมีตัวแปรตารางในสคริปต์ (ไม่ใช่โพรซีเดอร์ที่เก็บไว้) สองคำถาม:

  1. ฉันจะวางตัวแปรตารางได้อย่างไร Drop Table @varName ให้ข้อผิดพลาด "ไม่ถูกต้อง snytax"
  2. ฉันควรทำสิ่งนี้เสมอหรือไม่? ฉันได้ยินว่ามันเป็นแนวทางปฏิบัติที่ดี มันจำเป็นมากสำหรับสคริปต์ขนาดเล็กเช่นนี้หรือไม่?

นี่คือรหัสของฉัน:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work

คุณไม่สามารถวางเองได้ดังนั้นส่วนที่ 2 ของคำถามของคุณจะไม่มีผล
Martin Smith

คำตอบ:


189

ตัวแปรของตารางจะอยู่ในพื้นที่โดยอัตโนมัติและถูกทิ้งโดยอัตโนมัติคุณไม่ต้องกังวล


17
+1 - นอกจากนี้คุณไม่สามารถวางได้แม้ว่าคุณต้องการ - ยังคงมีอยู่ตราบเท่าที่เซสชันเปิดอยู่เช่นเดียวกับตัวแปรอื่น ๆ พวกเขายังไม่ได้รับผลกระทบจากการทำธุรกรรม
JNK

10
@JNK ชี้ให้เห็นว่าพวกเขาไม่ได้รับผลกระทบจากธุรกรรมเป็นสิ่งสำคัญคุณสามารถใช้ตัวแปรตารางเพื่อเก็บข้อมูลและเขียนลงในตารางบันทึกหลังจากเกิดข้อผิดพลาดทำให้เกิดการย้อนกลับ
HLGEM

3
ไม่มันไม่เหมือนกัน ตารางชั่วคราวมีส่วนร่วมในการทำธุรกรรม
Paul Perigny

หรือไม่เหมือนกับ CTE
Hogan

คุณไม่สามารถวางได้ แต่คุณสามารถลบได้ 'ลบ @projectList';)
RK Sharma

29

ตัวแปรตารางก็เหมือนกับตัวแปร int หรือ varchar

คุณไม่จำเป็นต้องทิ้งมัน มีกฎขอบเขตเดียวกันกับตัวแปร int หรือ varchar

ขอบเขตของตัวแปรคือช่วงของคำสั่ง Transact-SQL ที่สามารถอ้างอิงตัวแปรได้ ขอบเขตของตัวแปรจะคงอยู่ตั้งแต่จุดที่มีการประกาศจนกระทั่งสิ้นสุดชุดงานหรือกระบวนงานที่เก็บไว้ซึ่งจะประกาศ


1
คุณรู้หรือไม่ว่าวัตถุ tempdb ที่สร้างโดยตัวแปรตารางได้รับการล้างข้อมูลเมื่ออยู่นอกขอบเขต หรือเซิร์ฟเวอร์รอจนกว่าเซสชันจะปิดก่อนที่จะทำความสะอาด?
StriplingWarrior

21

หากมีคนอื่นเจอสิ่งนี้ ... และคุณจำเป็นต้องวางมันลงในขณะที่วนซ้ำคุณสามารถลบทั้งหมดออกจากตัวแปรตาราง:

DELETE FROM @tableVariableName

7

แต่คุณทุกคนลืมพูดถึงว่าหากใช้ตารางตัวแปรภายในลูปจะต้องมีการล้างข้อมูล (ลบ @table) ก่อนที่จะโหลดด้วยข้อมูลอีกครั้งภายในลูป


3

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


#temp table ไม่เหมือนกับตัวแปร @table จะไม่ดร็อปโดยอัตโนมัติหลังจากสิ้นสุดแพทช์หรือขอบเขตมันจะถูกลบโดยอัตโนมัติก็ต่อเมื่อสร้างขึ้นภายในโพรซีเดอร์ที่จัดเก็บและโพรซีเดอร์ที่จัดเก็บเสร็จสิ้นการรัน
Abou-Emish

1

นี่คือวิธีแก้ปัญหา

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

ทำงานได้ดีบน SQL Server 2014 Christophe

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