Sql-Server-2008

SQL Server:如何呼叫沒有模式名稱的儲存過程?

  • December 27, 2016

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 中。

引用自:https://dba.stackexchange.com/questions/7254