2011-09-21 112 views
1

我剛剛部署了一個新的存儲過程到我們的測試環境,只是爲了讓它在執行時失敗,因爲測試系統沒有包含存儲過程依賴的表。我相信這是由於deferred name resolution是否有解決SQL Server延遲名稱解析的方法?

事情是,我覺得有時在過去,我試圖創建存儲過程,由於缺少依賴關係而失敗。但我可能是錯的。

無論如何,是否有可能以某種方式強制名稱解析創建一個存儲過程?如果是這樣,是否有任何方法使sqlcmd和SSMS一起工作?

通過這種方式,我們可以瞭解腳本的首次執行時缺少的依賴性。

在附註上,我有興趣閱讀關於延遲分辨率如何工作的明顯deviation from the MSDN doco

編輯:我們混合了2005/2008(不受我控制),所以我需要一個2005解決方案來處理這兩個實例。

+1

您可以在投票[連接問題(http://connect.microsoft.com/SQL /feedback/ViewFeedback.aspx?FeedbackID=127152),但似乎沒有太多的動作(除了upvotes),並沒有列出的解決方法。 –

+0

請說明SQL Server版本 –

+0

在最後一段中,我不確定人們在閱讀和理解整個MSDN文檔。它沒有說它會在啓動前發生錯誤,它說:「如果執行存儲過程時由存儲過程引用的對象丟失,則存儲過程**在到達引用缺失對象的語句時停止執行**「(我的重點) –

回答

4

您可以調查WITH SCHEMABINDING,但由於Damien鏈接到的連接項目的評論中指出的原因,這可能不適用於您。

如果SQL Server 2008上,你也可以看看sys.sql_expression_dependencies

CREATE PROC bar 
AS 
SELECT * 
FROM DoesNotExist 
JOIN AlsoDoesNotExist ON 1=1 

GO 

CREATE TABLE DoesNotExist 
(
X INT 
) 
GO 

SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name, 
     referenced_entity_name 
FROM sys.sql_expression_dependencies 
WHERE referenced_id IS NULL 

返回

referencing_entity_name  referenced_entity_name 
------------------------------ ------------------------------ 
bar       AlsoDoesNotExist 
+0

感謝您的想法。我明天會看看。 –

+0

我只是做一些關於使用WITH SCHEMABINDING進行程序的研究。從我讀過的內容可以看出,SCHEMABINDING目前不適用於存儲過程。 Damien發佈的鏈接中的評論似乎表明,如果在將來的某個版本中,SCHEMABINDING作爲存儲過程的選項提供,那麼它可能是不受歡迎的。你會建議程序化的依賴性檢查在2005年除了在執行時間之外是不可能的嗎? –

+0

除了上面我的評論,似乎MSDN doco for sp_refreshsqlmodule - http://msdn.microsoft.com/en-us/library/bb326754(v=SQL.90).aspx引用「... nonschema-綁定存儲過程..「,所以也許我關於SCHEMABINDING存儲過程的假設是不正確的。如果是這樣,你有關於所需語法的想法嗎?我試過了; CREATE PROCEDURE [DBO]。[TGA_SB1] \t WITH SCHEMABINDING AS BEGIN \t SELECT * FROM nothinghere END GO ,但沒有奏效。 –