SQL Server:如何呼叫沒有模式名稱的儲存過程?
SQL Server 2005std/2008web 版
db=user=schema=owner=‘John’
我正在將網站從一台伺服器移動到另一台伺服器。這段程式碼在帶有 SQL Server 2005 的舊伺服器上執行良好。
Dim sqlCmdVehicle As SqlCommand = New System.Data.SqlClient.SqlCommand("mySP_Name", sqlConn) Dim dtVehicle As New DataTable With sqlCmdVehicle .Parameters.AddWithValue("FullStockNo", "N102010") .CommandType = CommandType.StoredProcedure End With sqlConn.Open() sqlAdapter.SelectCommand = sqlCmdVehicle sqlAdapter.Fill(dtVehicle)
數據庫已備份並在新伺服器上成功恢復。當我嘗試使用新的 SQL Server 2008 執行時,出現錯誤:
找不到儲存過程“mySP_Name”。
指向最後一行。我可以看到“MS SQL 管理工作室”的程序不是 dbo.mySP_Name 而是 John.mySP_Name
當我改變
System.Data.SqlClient.SqlCommand("mySP_Name", sqlConn)
進入
System.Data.SqlClient.SqlCommand("John.mySP_Name", sqlConn)
一切都很好,但是所有其他程序和程式碼中的很多這樣的地方都是一樣的:(
我得到了http://msdn.microsoft.com/en-us/library/ms189915.aspx,但呼叫者的預設架構是正確的。同樣,在舊盒子上一切正常。
我應該在 SQL 中修復什麼以允許在沒有明確提及使用者/模式名稱的情況下執行 SP?
謝謝你。
=======================================
不幸的是,我沒有找到好的解決方案。我採取的方法是將整個項目的 SP_Name 搜尋並替換為 John.SP_Name。感謝所有參與者。
最佳實踐始終是限定所有對象引用的模式。請參閱Tibor Karaszi 的這篇文章或Midnight DBA 的這篇文章,或者相信我或MS SQL Server 最佳實踐分析器
但是如果你選擇忽略最佳實踐,你可以執行它:
ALTER SCHEMA dbo TRANSFER John.mySP_Name;
你想要約翰模式嗎?您還有 dbo 架構嗎?這可能與您發布的其他問題有關。
關於這個問題,我認為您不能設置一個程序來忽略模式。如果您在模式(例如 dbo)內操作並試圖在另一個模式(約翰)中呼叫對象,我相信您必須使用模式名稱。
您可以使用以下命令將儲存過程移動到 dbo
ALTER SCHEMA dbo TRANSFER nameandschemaoftheSP;
聽起來您有許多需要移動的儲存過程。下面的程式碼應該生成將 john 模式中的每個儲存過程移動到 dbo 模式所需的腳本。然後,您可以決定要執行哪些。
SELECT 'ALTER SCHEMA john TRANSFER ' + s.Name + '.' + p.Name FROM sys.Procedures p INNER JOIN sys.Schemas s ON p.schema_id = s.schema_id WHERE s.Name = 'dbo';
除此之外,我會看一下 dbo 模式並做一些研究,看看為什麼以前在 dbo 中的儲存過程會意外地出現在 john 中。