สร้างมุมมองในฐานข้อมูลที่ระบุด้วย SQL แบบไดนามิก?


16

ฉันกำลังเขียน sql แบบไดนามิกเพื่อวางและสร้างมุมมองในฐานข้อมูลอื่น

ดังนั้นฉันจึงเขียนว่า:

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)

มันทำให้ฉันมีข้อผิดพลาด:

'สร้างมุมมอง' ต้องเป็นคำสั่งแรกในชุดการสืบค้น

ถ้าฉันลบคำสั่ง USE DATABASE มันใช้งานได้ดี แต่ฐานข้อมูลไม่ได้ระบุอีกต่อไป ....

ฉันจะแก้ปัญหานี้ได้อย่างไร

คำตอบ:


25

คุณสามารถใช้EXECสายซ้อน บริบทฐานข้อมูลเปลี่ยนไปโดยUSEยังคงอยู่กับชุดย่อย

DECLARE @DB SYSNAME

SET @DB = 'tempdb'

DECLARE @CreateViewStatement NVARCHAR(MAX) 
SET @CreateViewStatement = '
      USE '+ QUOTENAME(@DB) +';
      EXEC(''
             CREATE VIEW [dbo].[MyTable] AS
             SELECT 1 AS [Foo]
      '')

                          '
EXEC (@CreateViewStatement)

1
+1 - หากคุณคัดลอกมุมมองโดยใช้ SMO นี่เป็นวิธีที่เฟรมเวิร์กทำได้เช่นกัน - คำจำกัดความจะถูกดำเนินการใน SQL แบบไดนามิกเพื่อหลีกเลี่ยงข้อ จำกัด
JNK

1
@KingChan - คุณสามารถ upvote และยอมรับ FYI;)
JNK

@JNK +1 แน่นอน ~ :)
King Chan

ทำงานได้อย่างแน่นอน !! แม้ว่าฉันจะใช้มัน แต่มีหลายตัวแปรภายในเคียวรีที่ซ้อนกันดังนั้นฉันจึงปวดหัวเพราะการจัดการคำพูด! ทางออกที่ดีแม้ว่า!

คุณเป็นฮีโร่ จะตั้งชื่อลูกคนหัวปีของฉันหลังจากที่คุณ
เจนส์

-1

วิธีหนึ่งที่ฉันจัดการเมื่อพบกรณีนี้คือการวาง GO หลังจากการใช้งาน

set @CreateViewStatement = 
'
  USE ['+ @DB +']; GO
  CREATE VIEW [dbo].[MyTable]
  AS

  SELECT ........something'
exec (@CreateViewStatement)

เพียงเท่านี้คุณก็รู้แล้วว่า stat ใน GO จะไม่ทำงานใน exec
King Chan

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