2010-04-26 15 views
7

Ho una stringa di lunghezza 1,44,000 che deve essere passata come parametro a una stored procedure che è una query di selezione su una tabella. Quando un dato è in una query (in C#) funziona correttamente. Ma quando lo passo come parametro per la stored procedure non funziona.Qual è la lunghezza massima di un parametro stringa su Stored procedure?

Qui è la mia stored procedure in cui ho dichiarato questo parametro come 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] 

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

Qui i @ItemNames parametro è una stringa concatinated con diversi nomi come 'Item1', 'Item2' , 'Item3' .... ecc.

Qualcuno può dire cosa è andato storto qui?

Grazie & saluti

Padma

+2

La lunghezza massima di un parametro stringa in una stored procedure dipende probabilmente dal database. Stai usando SQL Server? Quale versione? –

risposta

3

Dagli sguardi di database sintassi sembra Sql Server, these are the maximum sizes of things in Sql Server.

Bytes per short string column 8,000 

Probabilmente è il limitatore.

Sebbene:

Byte per varchar (max), varbinary (max), XML, testo o immagine colonna 2^31-1

(ie 2,147,483,647) suggerisce che Sql Server lo gestirà ma per ado.net.

+0

sebbene il limite di dimensione sia 2^31-1, non sta prendendo questo parametro che è dato come segue dal codice: command.Parameters.Add ("@ ItemNames", SqlDbType.VarChar) .Value = itemNames.ToString (); – padmavathi

+0

Non penso che il limitatore sia Sql Server, in questo caso, ma ADO.NET. Ricordo che quando stavo usando ADO/VBScript c'era un limite di circa 8.040 byte per un recordset - vedrò se riesco a trovare un riferimento, ma potrebbe esserci un limite cumulativo per l'input o l'output parametri su ADO.NET – amelvin

+0

OK, quindi, per essere chiari, ci sono circa 1000 byte per carattere –

0

massima si può passare a 8000 caratteri VARCHAR(MAX) proprietà e 4000 caratteri in NVARCAHR(MAX)

Se si desidera passare più di questo, allora avete bisogno di utilizzare per l'utente definire il tipo di tabella come parametro.

Passaggio 1: È necessario creare l'utente Definire tipo di tabella.

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

Fase 2: l'utente le udtt_ItemNames in negozio Procedura

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] 

Così ora è necessario passare da tavolo, mentre eseguire la procedura di memorizzazione.

4

Mi rendo conto che questa è una vecchia domanda, ma il problema che vedo non è una limitazione del campo, ma la sintassi. Il problema è che la stored procedure non considera il parametro come una stringa da inserire nel testo SELECT, ma sta letteralmente cercando la presenza della stringa 1M + nel proprio campo. Ci sono un paio di modi per affrontare questo.

In primo luogo, si può costruire la SQL in modo dinamico in una variabile, e quindi eseguirlo in questo modo:

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

Tuttavia, questo sarà ancora fallire, perché @ItemNames ha incorporato le citazioni in esso, causando la SQL risultante essere non validoPotresti essere in grado di modificare @ItemNames con:

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

ma non l'ho provato. L'idea qui è che si scrivono frasi singole con escape ('') nel testo stringa per inviare una singola virgoletta singola (') al processore di query. La funzione SOSTITUISCI sopra mostra il testo per ogni singola virgoletta e la sostituisce con due virgolette singole.

una soluzione più robusta sarebbe quella di creare una funzione con valori di tabella Spalato, quindi modificare la clausola con qualcosa di simile:

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

Io parto dal presupposto che si sta prendendo cura delle citazioni incorporati nel Spalato funzione. Non è consigliabile semplicemente rimuovere le virgolette con un REPLACE, poiché le virgolette potrebbero proteggere le virgole all'interno del valore di stringa.

Problemi correlati