2010-04-26 57 views
7

我有具有作爲參數來存儲的過程,其是一個表上的選擇查詢要傳遞長度1,44,000的字符串。 當給予這是一個查詢(在C#),其工作的罰款。但是,當我將它作爲存儲過程的參數傳遞它不工作。什麼是字符串參數存儲過程的最大長度是多少?

這裏是在我宣佈這個參數爲NVARCHAR(MAX),我的存儲過程

------------------------------------------------------ 
set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 

CREATE PROCEDURE [dbo].[ReadItemData](@ItemNames NVARCHAR(MAX),@TimeStamp as DATETIME) 

AS 

select * from ItemData 

where ItemName in (@ItemNames) AND [email protected] 

--------------------------------------------------------------------- 

這裏的參數@ItemNames是用不同的名稱,如 「項目1」串連一個字符串,「項目2」 「項目3」 ....等。

誰能告訴了什麼問題嗎?

感謝&問候

帕德瑪

+2

存儲過程的字符串參數的最大長度可能取決於數據庫。你在使用SQL Server嗎?哪個版本? – 2010-04-26 09:35:43

回答

3

從數據庫的外觀語法,它看起來像SQL服務器,these are the maximum sizes of things in Sql Server

Bytes per short string column 8,000 

可能是限制器。

雖然:

字節每VARCHAR(最大), VARBINARY(最大),XML,文本或圖像 柱2^31-1

(即2,147,483,647)表明Sql Server會處理它,但對於ado.net。

+0

儘管大小限制爲2^31-1,但它並未從代碼中獲取以下參數: command.Parameters.Add(「@ ItemNames」,SqlDbType.VarChar).Value = itemNames.ToString( ); – padmavathi 2010-04-26 09:53:38

+0

我不認爲限制器是Sql Server,在這種情況下 - 但是ADO.NET。我記得(當天回來的時候),當我使用ADO/VBScript時,記錄集的最大限制爲8040字節 - 我會看看我能否找到一個參考,但可能會有輸入或輸出的累積限制ADO.NET上的參數 – amelvin 2010-04-26 10:16:58

+0

好的,所以要清楚的是,每個字符大約有1000個字節 – 2012-10-20 23:22:25

0

最高如果你想那麼那麼你需要使用用戶自定義表類型作爲參數傳遞更多你可以通過在VARCHAR(MAX)財產8000個字符,並在NVARCAHR(MAX)

4000個字符。

第1步:需要創建用戶定義表類型。

CREATE TYPE udtt_ItemNames AS TABLE 
(
    Item nvarchar(100)  
) 

第2步:用戶udtt_ItemNames到存儲過程

CREATE PROCEDURE [dbo].[ReadItemData](@ItemNames udtt_ItemNames readonly,@TimeStamp as DATETIME) 

AS 

select * from ItemData 

where ItemName in (select Item from @ItemNames) AND [email protected] 

所以,現在你需要傳遞表,同時執行存儲過程。

4

我意識到這是一個老問題,但我看到的問題不是字段限制,而是語法問題。問題在於存儲過程不會將該參數視爲要插入到SELECT文本中的字符串,而是從字面上查找字段中是否存在1M +字符串。有幾種方法可以解決這個問題。

首先,可以動態生成SQL的一個變量,然後像這樣運行它:

DECLARE @SQL as nvarchar(max) 
SET @SQL = 'SELECT * FROM ItemData WHERE ItemName in (' + @ItemsNames + ')' 
     + ' AND TimeStamp = ''' + @TimeStamp + '''' 
EXEC (@SQL) 

然而,這仍然會失敗,因爲@ItemNames嵌入了引號,使所得SQL無效。您可能能夠更改@ItemNames:

REPLACE(@ItemNames, '''', '''''') 

但我沒有測試過這個。這裏的想法是,您正在字符串文本中寫入轉義的單引號(''),以向查詢處理器發送單個單引號(')。上面的REPLACE函數在文本內部查看任何單引號,並用兩個單引號替換它們。

一個更強大的解決方案是創建一個拆分表值函數,然後用類似改變你的IN子句:

WHERE ItemName IN (SELECT SplitText FROM dbo.Split(@ItemNames)) 

我假設你正在拆分內再進行嵌入式引號的護理功能。我不建議用REPLACE刪除引號,因爲引號可能會保護字符串值中的逗號。

相關問題