2014-02-10 64 views
3

我有一個帶有SQL2012數據庫的經典ASP應用程序。我最近將表列從varchar(8000)更改爲varchar(max),因爲它不足以存儲所需的數據。返回varchar(max)存儲過程中的輸出參數截斷爲4000個字符

我可以使用所有需要存儲的數據更新列,但是我使用SP作爲輸出參數返回列數據只返回4000個字符(至少這是以下代碼的結果是給我:

Len(cmd.Parameters("@detail").Value) 

我用下面的參數聲明爲調用部分SP:

cmd.Parameters.Append cmd.CreateParameter("@detail", 8, 2, -1, strDetail) 

8是用於adBStr的價值,我試圖改變8 200,201和203,但是這給出了以下錯誤:

Error: 800a0e7c

Description:
Parameter object is improperly defined. Inconsistent or incomplete information was provided.

我認爲更新數據將是艱難的一點,但我不能找出如何檢索列的全部內容。

我返回列的DATALENGTH,它表示長度爲10,536,但我只能獲得4,000個字符,包括通過輸出參數返回的空格。我可以從Visual Studio中看到所有的數據(10k個字符),所以我知道它在那裏。

我的連接字符串Provider = SQLOLEDB.1。這可能是一個問題嗎?我應該使用較新的SQL Server Native Client 11.0 OLE DB Provider - SQLNCLI11嗎?

任何人有任何想法?

乾杯, Mike。

+0

你不能只使用文本列而不是VARCHAR,那麼你可以爲你喜歡(當然,最大支持2GB),進入儘可能多的字符 – John

+0

我的理解是文本被SQL2005棄用。無論如何,Varchar(max)都可以提供高達2GB的相同能力。我已經閱讀了關於由varchar(max)隱式轉換爲varchar的截斷髮生,但我無法看到在我的情況下會發生什麼。感謝您的評論。 – Mike

+0

http://stackoverflow.com/questions/834788/using-varcharmax-vs-text-on-sql-server 連接字符串 - 不是問題 – Zam

回答

3

您對連接字符串假設是現貨上

您需要使用SQL Server本機客戶端,而不是SQLOLEDB.1支持VARCHAR(MAX)NVARCHAR(MAX)數據類型,否則會被截斷回到那裏SQLOLEDB當量。

然後,您要使用以下參數定義

'For varchar(max) OUTPUT use; 
Call cmd.Parameters.Append(cmd.CreateParameter("@detail", adLongVarChar, adParamOutput, -1, strDetail)) 

'For nvarchar(max) OUTPUT use; 
Call cmd.Parameters.Append(cmd.CreateParameter("@detail", adLongVarWChar, adParamOutput, -1, strDetail)) 

'** Constants ** 
' adLongVarChar = 201 
' adLongVarWChar = 203 
' adParamOutput = 2 
+1

Thanks @Lankymart,則新的大值類型會在運行時映射到老派的LOB類型。 – Mike

相關問題