2014-04-22 24 views
0

我正在尋找從一個數據庫遷移到另一個數據庫的幾個SQL視圖。兩個數據庫定義都是相同的,所以我不必擔心兼容性問題。我將不得不在多個客戶端系統上執行此任務,因此我正在尋求將其自動化,而不是使用「腳本視圖另存爲」選項並手動複製每個視圖。遊標執行t-sql創建視圖語句

我是全新的遊標,所以我很抱歉,如果這是一個非常簡單的請求,但我已經嘗試了幾種方法,並沒有得到任何地方。我對這個網站和其他網站的搜索結果都毫無結果。這就是我來了這麼遠:

declare @sql nvarchar(max) 
declare @view nvarchar(max) 
declare @dbname nvarchar(30) 
set @dbname = 'DatabaseName' 


DECLARE cCursor CURSOR LOCAL FOR 
SELECT VIEW_DEFINITION 
from INFORMATION_SCHEMA.views 
where TABLE_NAME like '%MyCriteria%' 

OPEN cCursor 
FETCH NEXT FROM cCursor into @view 
     WHILE @@FETCH_STATUS = 0 
    BEGIN 
    set @sql = 'USE ' + @dbname + ' GO ' + @view 
    execute @sql 
    FETCH NEXT FROM cCursor into @view 
END 
close cCursor 
deallocate cCursor 

我得到執行時的錯誤消息說: 消息203,級別16,狀態2,行17 名稱「USE DATA14 GO CREATE VIEW ....不是有效的標識符。

其中....表示從信息架構中獲取的創建視圖語句。

任何想法我做錯了什麼?

在此先感謝。

編輯:

我嘗試另一種方法是不依賴於光標,我相信我是接近,但我仍然得到了我莫名其妙的錯誤:

use SourceDB 
go 

declare @sql nvarchar(max) 

set @sql = N'' 

select @sql = @sql + 'USE DestDB' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) +       s.definition + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) 
from sys.sql_modules as s 
inner join sys.objects as o 
on s.object_id = o.object_id 
where o.type_desc = 'VIEW' 
and s.definition like '%MyCriteria%' 

exec data14..sp_executesql @sql 
--select @sql 

錯誤的文本消息是: 消息102,級別15,狀態1,行2 「GO」附近的語法不正確。 Msg 111,Level 15,State 1,Line 3 'CREATE VIEW'必須是查詢批處理中的第一條語句。 消息102,級別15,狀態1,行22 附近有語法錯誤GO'...... 等等等等爲列表中的

回答

0

另一種選擇是使用Powershell的每個視圖。有很多方法可以做到這一點,我個人喜歡爲每個腳本創建一個文件,並且我假定這些視圖在新數據庫中不存在。所以這可能不會逐字地起作用,但應該讓你指出正確的方向。

  • 在服務器上創建一個導出文件夾(C:\ TEMP \查看)
  • 開啓在所述資源管理器對象的源服務器。
  • 導航到源數據庫(/數據庫/ {數據庫名})
  • 上「視圖」右擊並選擇「開始Powershell的」
  • 執行命令,這將爲每個視圖創建一個文件:

    ls | ? { $_.name -match "MyCriteria" } | %{ $_.scriptheader(0) + $_.textbody > "C:\temp\views\$($_.Schema).$($_.name).sql" }

  • 導入腳本到另一個數據庫與

    ls "C:\temp\views" | %{ invoke-sqlcmd -inputfile $_.fullname -database "DatabaseName" }

+0

感謝您抽出寶貴的時間,但我不認爲這會爲我工作的原因。我對Powershell的瞭解少於我對光標的瞭解,因此,重新設計這些以適應我的需求將非常耗時。另外,如果我理解正確,這將意味着創建目錄,在控制檯中運行每個語句,然後清理目錄。這減少了手工勞動的數量,但仍然留下比理想的步驟更多的步驟。 – 3xStampA2xStamp

0

爲了實現您要查找的內容,您必須將動態SQL嵌套在動態SQL中...

DECLARE @sql nvarchar(max) 
DECLARE @dbname nvarchar(30) 
SET @dbname = 'DatabaseName' 
SET @sql = ''; 

SELECT @sql = @sql + ' 
EXEC ' + @dbname + '.sys.sp_executesql N''' + REPLACE(VIEW_DEFINITION, '''', '''''') + '''' 
FROM INFORMATION_SCHEMA.views 
WHERE TABLE_NAME like '%table%' 

EXEC (@sql); 

雖然有一個問題。 雙動態SQL需要雙重逃脫。因此,上面的REPLACE。

順便說一句...執行動態SQL的正確語法是EXEC(@SQL) - 注意括號 沒有括號,你告訴服務器執行一個過程。因此,對於你的第一個錯誤

希望幫助