2011-04-13 56 views
1

我想創建一個臨時存儲過程來創建幾個視圖;所以是這樣的:如何在存儲過程中創建多個視圖?

create proC#t1 as 
begin 
    create view v1 as select 1 as x 
    go 
    create view v2 as select 2 as x 
end 

不幸的是,當我在Microsoft SQL Server 2005中執行此,我得到第一create view行語法錯誤。

事情是這樣工作的:

create proC#t1 as 
begin 
    exec('create view v1 as select 1 as x') 
    exec('create view v2 as select 2 as x') 
end 

然而,這似乎是在做我想要什麼的可怕方式。

那麼,什麼是錯的第一次嘗試,什麼是創建一個存儲過程中的多個視圖的最佳方式?

+1

你爲什麼要創造這樣一個存儲過程中的視圖裏面程序語句創建視圖? ?視圖是數據庫的一部分 - 它應該與其他DML語句來創建.... – 2011-04-13 09:28:10

+0

「這似乎是在做我想要什麼的可怕的方式」 - 我同意(兩種形式)。也許如果你能告訴我們你想要達到什麼樣的總體目標,我們可以提出一個解決方案。正如marc_s所說,你通常不會創建視圖作爲存儲過程的一部分。 – 2011-04-13 09:37:18

+0

我可以想象,在存儲過程中創建視圖是不錯的。 – HLGEM 2011-04-13 17:53:55

回答

5

你不能有一個go在存儲過程中。它不是SQL中的命令,它是SQL管理器中的批處理之間的分隔符,因此它會將該過程分成兩批並導致語法錯誤,因爲這兩個批處理都不是完整的命令。

1

你不必寫一個完全成熟的解析器,使這項工作 - 所有你需要做的是什麼命令行工具/ SSMS做 - 從文件中讀取行,並在積累他們(在.NET中,它是一個stringbuilder,不記得Java中的等價物),直到遇到以字GO開頭的行。每次達到該點時,將累積的緩衝區發送到SQL Server,然後清空緩衝區並重新開始。

只要當前的腳本有GO每當它的需要,上面應該工作。

+0

你如何發送,清空然後重新開始? – 2015-03-01 18:16:22

0

這是很容易就可以做到這一點使用可變,分配給@variable然後EXEC(@Variable)