2011-11-23 129 views
0

我有一個奇怪的問題無法生成腳本在SQL Server Management Studio中3次2008

當我創建對象的腳本(腳本,刪除和創建存儲過程,視圖,函數)從SQL Server 2008的它錯過3意見不知道爲什麼?

我執行以下步驟來創建對象的腳本

1)打開SQL Server 2008 Management Studio中 2)連接到服務器 3)右鍵單擊選中的數據庫,然後單擊任務 - >生成腳本,然後選擇數據庫從列表中,單擊下一步。 4)現在選擇SP,視圖和函數,然後點擊Next, 5)它給出了我正在改變的三個選項的選項,即包含If不存在= true,腳本下拉= true,腳本使用數據庫=假和拼接下一步按鈕 5)點擊Select All for All即將到來的屏幕 6)最後點擊Finish按鈕。

是否有任何限制或特殊條件或約定,我沒有遵循並導致視圖不包含在生成腳本中?

請讓我知道如果我失去了一些東西,我嘗試了很多方法。

我還發現這個問題不僅存在於視圖中,而且它也存在於函數和存儲過程中。

如果我們將其重命名它工作得很好,例如早些時候被任命爲dbo.SeperateElementsInt功能工作正常,但奇怪的是,生成腳本忽略了這個功能,以後我們把它改名爲dbo.SeperateElementsInteger,並開始生成腳本。

我們無法更改視圖名稱,因爲它在許多地方都有使用。

查看這是給問題是dbo.DivisionInfo和dbo.CustomerDivisonOfficeInfo 存儲過程,而被賦予的問題是dbo.procsync_get_zVariable

與2005年SSMS也存在問題。

感謝

+0

你能腳本他們通過視圖對象資源管理器,並選擇腳本查看右鍵點擊? –

+0

是的,只有當我們「選擇所有」視圖時纔會出現問題,如果您選擇包括它們在內的10-15個視圖,腳本將會生成 –

+0

不幸的是,我不知道除了打開輪廓儀並查看爲什麼SSMS看不到看法?有一次,它將不得不查詢INFORMATION_SCHEMA或其他系統對象以獲取視圖列表。還有一件事:當您在生成腳本時選擇全部時,檢查這3個視圖是否顯示在列表中。 –

回答

0

我們不瞭解對方INFORMATION_SCHEMA廓問題。我建議打開分析器,因爲SSMS在INFORMATION_SCHEMA上做了一些SELECT語句和where子句。我懷疑查詢本身會切斷你的觀點。一旦你有一個查詢,SSMS執行以獲取對象列表你應該找到爲什麼它沒有看到一些視圖。

以下是SSMS在選擇所有視圖並啓動腳本時執行的腳本。檢查它們中的任何一個是否不返回DivisionInfo視圖。 (我在我的數據庫中創建了DivisionInfo視圖來重現您的案例)。爲了快速檢查,請逐一執行並在每次查詢後閱讀我的評論。 請注意,您應該事實上使用Profiler捕捉您的環境,因爲它們可能會因環境而異。

顯示屏幕選擇視圖,存儲過程之前,... SSMS執行緊隨腳本來獲取視圖列表:

exec sp_executesql N'SELECT 
''Server[@Name='' + quotename(CAST(
     serverproperty(N''Servername'') 
     AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/View[@Name='' + quotename(v.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(v.schema_id),'''''''') + '']'' AS [Urn], 
v.name AS [Name], 
SCHEMA_NAME(v.schema_id) AS [Schema] 
FROM 
sys.all_views AS v 
WHERE 
(v.type = @_msparam_0)and(CAST(
case 
    when v.is_ms_shipped = 1 then 1 
    when (
     select 
      major_id 
     from 
      sys.extended_properties 
     where 
      major_id = v.object_id and 
      minor_id = 0 and 
      class = 1 and 
      name = N''microsoft_database_tools_support'') 
     is not null then 1 
    else 0 
end   
      AS bit)=0) 
ORDER BY 
[Schema] ASC,[Name] ASC',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'V' 

您的看法上市?您可以添加條件WHERE v.name = 'DivisionInfo'進行過濾。如果沒有列出DivisionInfo,請檢查此查詢的哪一部分將其從結果集中刪除。

一旦您選擇了腳本對象並啓動腳本,SSMS將創建臨時表,存儲對象並執行腳本以查找相關對象。

在它創建臨時表和插入DivisionInfo視圖:

CREATE TABLE #tempdep(的objid詮釋NOT NULL,objname表SYSNAME NOT NULL,objschema類型爲sysname NULL,objdb類型爲sysname NOT NULL,OBJTYPE SMALLINT NOT NULL)

exec sp_executesql N'INSERT INTO #tempdep 

SELECT 
v.object_id AS [ID], 
v.name AS [Name], 
SCHEMA_NAME(v.schema_id) AS [Schema], 
db_name(), 
2 
FROM 
sys.all_views AS v 
WHERE 
(v.type = @_msparam_0)and([email protected]_msparam_1 and SCHEMA_NAME(v.schema_id)[email protected]_msparam_2)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'V',@_msparam_1=N'DivisionInfo',@_msparam_2=N'dbo' 

已將此查詢插入#tempdep中的任何內容?如果不是,請檢查原因。 再一次,您必須使用Profiler從您的環境中獲取查詢,而不是使用我放在這裏的查詢,因爲它們來自我的環境。

當你開始分析時,應該有許多像上面那樣的插入。您需要找到與DivisionInfo相關的一個。您可以使用「查找」選項來查找它,因爲您將在Profiler中看到許多查詢,因爲您有很多其他視圖。爲了使剖析器日誌更小,僅腳本視圖。

正如您所看到的,想法是開始分析並啓動腳本。腳本編寫完成後,停止分析器並檢查由SSMS執行的腳本。你應該找到爲什麼它看不到DivisionInfo。如果Profiler日誌中沒有DivisionInfo,但您可以在嚮導中檢查腳本,然後爲DivisionInfo和腳本編寫的一個視圖採取腳本,並查看它們之間的差異。仔細查看它們之間的差異,以瞭解SMSS用於檢索它們的腳本。

  • 出於某種原因SSMS丟棄該視圖根據數據
  • 他查詢提取(從探查逮住)
0

我只是碰到了確切的問題。我們試圖編寫一個數據庫的模式(稱爲Database_A),許多視圖不會編寫腳本。

我們已經退役了另一個數據庫(稱爲Database_B)以及所有不會腳本(在Database_A中)指向該數據庫(Database_B)的視圖 - 該視圖是通過鏈接服務器訪問的,並且處於脫機狀態。由於所有連接字符串現在都指向Database_A現在所在的新服務器,因此我只需在read_only上在線連接舊服務器上的Database_A足夠長的時間以編寫視圖腳本,並且它可以工作。再次使數據庫脫機,我們有我們需要的。

我扔在一起的腳本找到的意見,鏈接服務器引用是這樣的:

use Database_B 
    go 

    select so.name, sc.text 
    from sysobjects so, syscomments sc 
    where so.id = sc.id 
    and sc.text like '%Database_A%' 

這對我工作,我希望它爲你。

保重,

湯姆

相關問題