3

我們有一個經典的ASP應用程序,它的工作原理很簡單,我們不願意修改代碼以免引起一些長期死亡的希臘神的憤怒。從另一個存儲過程通過經典ASP調用存儲過程的問題

我們最近有要求將功能添加到應用程序。功能實現實際上只是一個數據庫操作,只需對UI進行最小限度的更改。

我改變了用戶界面,並做了小修改,以提交一個新的數據值到存儲過程調用(sproc1)。

在直接從ASP調用的sproc1中,我們向恰好位於另一個服務器sproc2上的另一個sproc添加了一個新調用。

不知何故,這不能通過我們的ASP應用程序工作,但可以在SQL Management Studio中工作。

這裏的技術細節:兩個數據庫服務器上

  1. SQL 2005。
  2. Sql登錄正在從ASP應用程序向SQL 2005服務器1進行身份驗證。
  3. 服務器1到服務器2的鏈接服務器正在工作。
  4. 從SQL Management Studio執行sproc1時 - 工作正常。即使當我們的代碼使用相同的用戶時(應用程序sql登錄)。
  5. 當從SQL Management Studio獨立於sproc1調用sproc2時,sproc2可以工作。
  6. VBScript(ASP)捕獲XML中返回給客戶端的錯誤。錯誤編號爲0,錯誤描述爲空。無論是從ADODB.Connection對象還是從ASP端的VBScript中產生的任何Err.Number/Err.Description。

所以沒有任何錯誤,也沒有任何可重複性(即通過SQL Mgmt Studio) - 有誰知道這個問題嗎?

我們目前的計劃是打破並深入ASP端的代碼,並直接從ASP完全獨立地調用Server 2.sproc2,而不是試圖通過sproc1捎帶回來。

+0

找到相同的問題,有關更多的背景信息可能在這裏的問題:http://stackoverflow.com/questions/605996/ms-sql-suppress-return-value-of-stored-procedure-called-in -stored-procedure – BlaM 2009-03-03 11:20:06

回答

0

我的第一反應是,這可能不是一個調用跨服務器的問題,而是從第一個調用第二個proc的問題,而那個這個可能是兩種不同環境中的行爲不同。

我的第一個問題是:如果從等式中刪除跨服務器方面會發生什麼?如果你可以建立一個測試系統,你的第一個進程調用你的第二個進程,但第二個進程在同一個服務器上和/或在同一個數據庫中,你是否仍然遇到同樣的問題?

沿着同樣的道路:根據我的經驗,當應用程序和SSMS得到不同的結果時,它通常是存儲過程設置的問題。正如盧克所說,它可能是NOCOUNT。雖然我似乎記得PRINTED值成爲錯誤描述的一部分(非常違反直覺),但我已經在代碼中發生了多餘的PRINT語句。

如果任何東西在消息窗口中返回,當你在SSMS中運行它時,找出它來自哪裏並使其停止。我將不得不查看技術術語,但我的回憶是,不同的查詢環境對「錯誤」具有不同的敏感度,並且通過SSSM的默認連接不會在某些時候發生錯誤,即來自腳本語言的ADO連接將。

最後一個想法:萬一它是一個環境的東西,請嘗試ASP頁面的連接字符串不同的設置。例如,如果您有OLEDB連接,請嘗試ODBC。嘗試使用本地和非本地SQL Server驅動程序。查看你的提供者支持哪些連接字符串選項,並嘗試其中任何看起來可能值得嘗試的選項。

+0

我終於能夠實現這個代碼。我從ASP打出了對SPROC2的呼叫。仍然錯誤!我回顧了NOCOUNT和PRINT(以及其他任何可以提供輸出的代碼)的代碼,但無濟於事。我最終寫了一個黑客,因爲錯誤號= 0始終如一。 – Aaron 2008-09-23 04:40:21

1

你可以從double-hop problem

雙躍點問題是痛苦是當ASP/X頁嘗試使用位於是從IIS服務器不同的服務器上的資源。

Windows NT質詢/響應does not support雙躍模擬(在傳遞給IIS服務器後,相同憑證無法傳遞到後端服務器進行身份驗證)。

您應該使用SQL事件探查器驗證嘗試的第二個連接。

請注意,通過您的手動測試,您不通過IIS進行身份驗證。只有當你通過ASP/X頁面啓動sql時,這個問題纔會顯現出來。

更多資源:

0

示例代碼可以幫助:)你試圖返回從存儲過程兩個表;我不認爲ADO 2.6可以處理多個表被返回。

0

我確實認爲(雙跳),但是像我指的是一個存儲過程的調用與通過INNER JOIN的典型的跨服務器聯接之間有什麼區別?兩者都將在服務器1上執行,使用鏈接服務器憑據並向服務器2進行身份驗證。

任何人都可以確認調用超級跨服務器與在數據表上進行連接不同嗎?爲什麼?

如果鏈接的服務器配置是一個SQL帳戶 - 這算是一個雙跳(因爲你指的是NTLM雙跳?)

在多個結果是否都回來了條件 - 沒有。 Server1.Sproc1和Server2.Sproc2都將是.net世界中的「ExecuteNonQuery()」,並且不會返回任何內容(沒有結果集,也沒有返回值)。

0

嘗試檢查連接字符串中指定的用戶對數據庫的權限。 在使用sql mgmt studio時,在連接字符串中使用相同的用戶名登錄數據庫。

創建一些臨時表來編寫中間值和異常,因爲它可以成爲調試應用程序的有效方式。

3

你有設置在設置nocount在這兩個存儲過程?我曾經有過類似的問題,雖然我現在還記不清我是怎麼解決它的,但我知道這跟它有關係。

0

我可以檢查:您是否增加了sproc2?在此之前,它工作很好很多年了。

難道你不能改變你從哪裏調用sproc2嗎?而不是從sproc1內部調用它,你可以從ASP調用它嗎?通過這種方式,您可以在代碼中控制對SQL的身份驗證,而不必依賴在服務器上設置任何信任或共享遠程身份驗證。

0

您的鏈接服務器是如何設置的?通常您可以選擇如何向遠程服務器進行身份驗證,其中包括以當前登錄的用戶身份登錄或指定要始終使用的SQL登錄名。您是否嘗試將其設置爲始終使用特定帳戶?這應該消除調用遠程過程中的任何可能的權限問題...

1

我有一個類似的問題,我通過設置nocount和刪除打印命令來解決它。

相關問題