疑難排解資料庫專案、建置和部署的問題
更新:2010 年 7 月
當您建立、修改、建置或部署資料庫專案時,可能會遇到以下問題:
資料庫物件中的錯誤
在 Microsoft SQL Server 2005 中使用新的保留字
命令列建置的差異
相依性與更新指令碼
引號識別項可能會造成專案重新載入的問題
資料庫的內部狀態與其內容不一致
復原暫止的變更
找不到 Windows NT 使用者或群組
複製物件名稱及排除檔案
資料庫限定和伺服器限定名稱
匯入資料庫結構描述的效能
組建錯誤巡覽
使用跨資料庫參考時發生語法錯誤
重新命名 SQLCLR 專案和組件
FULLTEXT STOPLIST 不支援的語法
無法匯入 SORT_IN_TEMPDB 子句
當您匯入包含多個陳述式的資料表值函式時,就會遺失引號識別項狀態
建置專案之後無法清除某些專案錯誤
資料庫物件中的錯誤
當「資料庫物件」(Database Object) 包含一個或多個語法錯誤時,相關聯的錯誤訊息就會出現在 [錯誤清單] 視窗中。
注意事項 |
---|
出現在 [錯誤清單] 視窗中的錯誤訊息應該會提供解決此錯誤可採取之動作的相關資訊。 當您解決錯誤並儲存資料庫物件之後,該資料庫物件的圖示會回到一般狀態,而錯誤也會從 [錯誤清單] 視窗中移除。 |
在 Microsoft SQL Server 2005 中使用新的保留字
下列是 SQL Server 2005 中的新保留關鍵字:EXTERNAL、PIVOT、REVERT、TABLESAMPLE 和 UNPIVOT。 如果您在以 Microsoft SQL Server 2005 或 SQL Server 2008 為目標的資料庫專案內使用這些保留關鍵字當做結構描述物件名稱,則 [輸出] 視窗中會出現錯誤。
注意事項 |
---|
若要解決這項限制,您可以用引號括住結構描述物件名稱。 例如,您可以使用 "CREATE TABLE [External] (c1 INT)"。 |
命令列建置的差異
如果當您在 Visual Studio 中開啟專案時執行命令列建置,您可能不會收到當您在使用者介面中建置時所收到的所有建置錯誤。
注意事項 |
---|
若要解決這個問題,請先在 Visual Studio 中關閉資料庫專案,然後再執行命令列建置。 |
相依性與更新指令碼
為了讓更新指令碼中的物件有正確的順序,「結構描述比較」會檢查物件相依性。 例如,假設檢視相依於資料表,就必須先建立資料表,才能建立檢視。 如果物件與第二個物件相依,但未使用符合結構描述資格的名稱,則可能無法辨識相依性,而且更新或建立指令碼的陳述式順序也可能不正確。 當您更新「目標」(Target) 使其與「來源」(Source) 相符,或是將變更部署至資料庫時,這樣的差異可能會產生錯誤。 資料庫建置指令碼也有相同的問題。
注意事項 |
---|
若要解決此問題,請確定與相依關聯性有關的物件有使用符合結構描述資格的名稱。 在 Visual Studio Premium 和 Visual Studio Ultimate 中,您可以使用資料庫重構來完整限定物件名稱。 如需詳細資訊,請參閱提供資料庫物件的完整名稱。在下列範例中,如果將陳述式的結尾變更為參考 [dbo].[KeysTable],而不只是 KeysTable,就能確保正確識別相依性: |
CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable
引號識別項可能會造成專案重新載入的問題
如果資料庫屬性中的 [SET QUOTED_IDENTIFIER] 核取方塊被清除,當您儲存物件或載入包含引號識別項的資料庫時,將出現錯誤。 如果您從使用引號識別項的資料庫匯入資料庫結構描述,則可能會發生這個狀況。
注意事項 |
---|
若要解決這個問題,您有兩個選擇。 您可以修改物件定義,使其使用方括弧,而不要使用引號。 例如,您可以將 "My Table" 變更為 [My Table]。 或者,您可以開啟 [專案] 功能表,按一下 [DatabaseProject 屬性],再按 [資料庫屬性] 索引標籤,然後選取 [SET QUOTED_IDENTIFIER] 核取方塊。 |
資料庫的內部狀態與其內容不一致
當您使用 Visual Studio Premium 時,可能會收到下列錯誤:「資料庫專案的內部狀態與其內容不一致。 請卸載專案然後重新載入,以解決這個問題」。這個錯誤表示此專案 (此專案會維護它認為有包含的檔案清單) 已經不再與檔案的狀態同步。 您可能會遇到這個錯誤的最常見原因就是當資料庫專案未開啟時,從磁碟中刪除專案內的其中一個檔案。 當您匯入資料庫結構描述時如果有發生問題,也會產生這個錯誤。
注意事項 |
---|
若要解決此問題,您可以按一下 [結構描述檢視] 中的 [同步處理]。 如果這樣仍然無效,則可以卸載此資料庫專案,然後再重新載入。 若要這樣做,請在 [方案總管] 中按一下此專案。 開啟 [專案] 功能表,然後按一下 [卸載專案]。 當此專案卸載之後,請開啟 [專案] 功能表,然後按一下 [重新載入專案]。 |
復原暫止的變更
當您使用版本控制系統的 [復原暫止的變更] 命令之後,[結構描述檢視] 不會自動重新整理。 例如,如果您將資料表或資料行重新命名,然後還原那些變更,則會在 [結構描述檢視] 中顯示「外部檔案變更,必須重新同步處理...」訊息。
注意事項 |
---|
若要解決此問題,您必須按一下 [結構描述檢視] 工具列上的 [同步處理]。 |
找不到 Windows NT 使用者或群組
如果資料庫專案參考了無法使用的登入,則會出現下列錯誤訊息:「找不到 Windows NT 使用者或群組 'DomainName\LoginName'。 請再一次檢查名稱」。當您使用之電腦所在的網域與匯入結構描述所屬的資料庫不同時,可能會遇到這個問題。 如果您在家中使用其他地方所建立的資料庫專案,通常會發生這個狀況。 在此狀況下,您將無法建置或部署資料庫專案。
注意事項 |
---|
您可以建立使用者並省略 FOR LOGIN 子句。 例如,您可以使用下列內容:CREATE USER [Domain\someLogin]。 當您部署此資料庫專案時,將會建立使用者,而且該使用者將會與 [Domain\someLogin] 登入產生關聯,但是資料庫專案中並不需要這個登入的參考。 |
複製物件名稱及排除檔案
如果您在資料庫專案中有重複的物件名稱 (例如,有兩個資料表命名為 Orders),則 [錯誤清單] 視窗中會出現錯誤。 即使當您排除包含其中一個物件之定義的檔案來解決此問題時,這個錯誤訊息也不會立刻消失。
注意事項 |
---|
若要解決此問題,您可以按一下 [重新整理],也可以修改包含物件定義的檔案,並重新命名此物件,然後再儲存檔案。 |
資料庫限定和伺服器限定名稱
當您在 Visual Studio Premium 中建立物件時,會根據 [schema].[object].[child] 命名規範來命名物件。 如果想要參考其他資料庫或其他伺服器的物件,您可以這個方式包含資料庫和伺服器的名稱:[server].[database].[schema].[object].[child]。 如果您所建立的預存程序或檢視表會參考需要資料庫限定或伺服器限定名稱的物件,則會出現警告。
注意事項 |
---|
若要解決這個警告,您必須定義跨資料庫參考。 如需跨資料庫參考的詳細資訊,請參閱在資料庫專案中使用參考和 HOW TO:將參考加入至資料庫專案。 |
重要事項 |
---|
如果專案具有資料庫限定或伺服器限定名稱的相關未解決警告,而且您在資料庫專案屬性的 [建置] 索引標籤上選取 [警告視為錯誤] 核取方塊,則部署將會失敗。 產生這個失敗是因為資料庫限定或伺服器限定的名稱會產生警告。 如果您要使用資料庫限定或伺服器限定的名稱,則必須清除 [警告視為錯誤] 核取方塊。 |
匯入資料庫結構描述的效能
如果您在 [測試清單編輯器] 視窗或 [測試檢視] 視窗開啟時匯入資料庫結構描述,匯入作業將需要較長的時間完成。 這種變慢的情況將同時會發生在 [新增資料庫專案精靈] 中 (如果選擇匯入資料庫結構描述) 及匯入資料庫結構描述作業期間。 即使在匯入資料庫結構描述之前關閉 [測試清單編輯器] 和 [測試檢視] 視窗,這個問題也會發生。
注意事項 |
---|
若要解決這個問題,您必須關閉 [測試清單編輯器] 和 [測試檢視] 視窗,關閉後重新啟動 Visual Studio,然後再匯入資料庫結構描述。 若為較小的結構描述,您可能不需要執行這些步驟。以 AdventureWorks 範例資料庫為例,在未開啟 [測試清單編輯器] 視窗的情況下,匯入結構描述作業需要 27 秒,而在開啟 [測試清單編輯器] 視窗的情況下,則需要 48 秒。 |
組建錯誤巡覽
如果部署失敗,您便無法透過更新已產生的組建指令碼來更正錯誤。 您必須更正用以產生該組建指令碼的原始程式檔 (Source File)。 如果您按兩下 [錯誤清單] 視窗中的部署錯誤,組建指令碼便會出現在編輯器中,並且顯示造成錯誤的指令碼行。
注意事項 |
---|
若要解決這個問題,您必須檢視組建指令碼,以判斷失敗的原因,然後必須在資料庫專案中修改含有錯誤的原始程式檔。 例如,如果部署後指令碼 Script.PostDeployment.sql 含有錯誤,您必須修改 Script.PostDeployment.sql,而非修改組建指令碼。 |
使用跨資料庫參考時發生語法錯誤
當您儲存的物件定義中包含其他資料庫中物件的參考時,您可能會收到一個或多個語法錯誤。 例如,您可以加入資料庫專案的參考、定義名為 RefServer 和 RefDatabase 的變數,並指派這些變數的值。 接著,您可能會定義檢視,如下所示:
CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM $(RefServer).$(RefDatabase).dbo.TableName
當您儲存這個定義時,您可能會收到一個或多個指出語法錯誤的錯誤訊息。 這些錯誤訊息可能會參考您的設計階段驗證資料庫的名稱,而可能造成混淆。
注意事項 |
---|
為了解決這個問題,您必須將變數名稱括在方括弧中。 若要更正此範例,請將它變更如下: |
CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].dbo.TableName
重新命名 SQLCLR 專案和組件
如果您重新命名了 SQLCLR 專案或組件,但沒有更新參考,就無法部署包含該 SQLCLR 專案或組件之參考的資料庫專案。
注意事項 |
---|
若要修正這個問題,請移除舊的參考,並且加入具有更新名稱之 SQLCLR 專案或組件的參考。 |
FULLTEXT STOPLIST 不支援的語法
Visual Studio Premium 不會針對 CREATE FULLTEXT STOPLIST 陳述式的選擇性 FROM { [DatabaseName.] SourceStoplistName } | SYSTEM STOPLIST ] 語法建立模型。 如果您匯入了使用該語法的物件,系統就會忽略該語法。
注意事項 |
---|
若要修正此問題,您必須手動將停用字詞加入至部署後指令碼。 如需詳細資訊,請參閱 HOW TO:指定部署前或部署後指令碼。 |
無法匯入 SORT_IN_TEMPDB 子句
Visual Studio Premium 無法匯入索引的 SORT_IN_TEMPDB 子句。 例如,您可能會有下列程式碼:
CREATE TABLE [dbo].[IndexTable]
{
[Column1] [INT] NOT NULL
}
GO
CREATE NONCLUSTERED INDEX [SortInTempDbOn] ON [dbo].[IndexTable]
{
[Column1] ASC
}
WITH (SORT_IN_TEMPDB = ON)
GO
此時,系統會匯入索引,但不匯入 SORT_IN_TEMPDB 子句。
注意事項 |
---|
若要修正此問題,每當您將資料庫的變更匯入專案時,都必須手動更正索引定義。 |
當您匯入包含多個陳述式的資料表值函式時,就會遺失引號識別項狀態
您可以匯入包含多個陳述式的資料表值函式,不過引號識別項字串的狀態不會儲存在 SQL Server 中。 當您匯入這些函式時,因為引號識別項的預設設定為開啟,所以可能會出現錯誤。
注意事項 |
---|
若要修正此問題,您必須在匯入物件和設定之後或將資料庫的更新寫入專案之後,針對包含多個陳述式的任何資料表值函式變更引號識別項設定。 |
重建專案之後無法清除某些專案錯誤
某些在資料庫專案中可能會遇到的錯誤並不會在您修正錯誤的原因之後消失,即使您重建專案也一樣。 例如,如果您使用 [Windows 檔案總管] 來刪除專案所參考的 .sqlpermissions 檔案,預期會發生錯誤。 如果您使用 [方案總管] 從專案中移除該檔案,然後進行重建,錯誤仍然會存在,即使您已經更正錯誤也一樣。
注意事項 |
---|
若要修正此問題,您必須在 [方案總管] 的工具列上按一下 [重新分析專案]。 |
部署後指令碼中的錯誤語法
根據預設,在 Visual Studio 2010 的 Transact-SQL 編輯器中,SQLCMD 模式處於關閉狀態。 進行這項變更的原因是,當 SQLCMD 模式啟用時,Intellisense 並非作用中。 當您部署時,如果已經在部署後指令碼中加入陳述式,可能會看見下列錯誤。
Incorrect syntax near ':'. C:\MySandbox\MySolution\MyProject\Scripts\Post-Deployment\Script.PostDeployment.sql
注意事項 |
---|
若要修正此問題,您必須啟用 SQLCMD 模式。 若要啟用 SQLCMD 模式,請按一下 [Transact-SQL 編輯器] 工具列上的 [SQLCMD 模式]。 |
請參閱
工作
概念
變更記錄
日期 |
記錄 |
原因 |
---|---|---|
2010 年 7 月 |
已加入警告使用者的項目,指出 Visual Studio 2010 中可能導致其部署後指令碼發生問題的預設行為變更。 |
客戶回函。 |