Eccezione esecuzione di una procedura immagazzinata con commutazione CASO da C # (T-SQL)

StackOverflow https://stackoverflow.com/questions/4019765

  •  26-09-2019
  •  | 
  •  

Domanda

Ho una colonna NVARCHAR (max) in una tabella e una stored procedure che aggiorna questa colonna nonché qualsiasi altra colonna della tabella utilizzando commutazione CASO:

CREATE PROCEDURE updateTable
   @columnName sysname,
   @value nvarchar(max)
AS 
   UPDATE [dbo].[TestTable]
   SET 
      BigNvarcharValue = CASE @columnName WHEN 'BigNvarcharValue' THEN @value ELSE BigNvarcharValue END,  
      TableName = CASE @columnName WHEN 'TableName' THEN @value ELSE TableName END

Tutto è buono se eseguo questa procedura da SQL Management Studio con

EXEC [dbo].[updateTable]
     @columnName = 'BigNvarcharValue',
     @value = N'SOME BIG 80Kb value'

I può anche aggiornare nomeTabella dal codice C # usando la stessa stored procedure, ma quando si tratta di aggiornare questo BigNvarcharValue da C #, non riesce con SQLException che "String o dati binari verrebbero troncati". Ora, ho pensato che abbia qualcosa a che fare con CASE in questa stored procedure, perché quando mi rompo a una stored procedure più semplice, tutto funziona bene:

CREATE PROCEDURE updateTable   
     @columnName sysname,   
     @value nvarchar(max)
AS       
   UPDATE [dbo].[TestTable]   
   SET BigNvarcharValue=@value

Ho letto un sacco di post del forum che descrivono il problema di cercare di inserire un valore più grande nella colonna NVARCHAR che potrebbe causare questa eccezione, ma doesnt sembrano applicare.

Sono abbastanza nuovo per T-SQL, quindi non ci sono limitazioni di CASE che io non conosco?

P.S. BigNvarcharValue è NVARCHAR (MAX) e TableName è NVARCHAR (50)

È stato utile?

Soluzione

Quali sono i tipi di dati delle colonne vi state occupando? Perché ho riprodotto l'errore tentando di inserire un valore che è consentito dalla NVARCHAR (max) in una colonna che è VARCHAR (50).

Per ribadire -. NVARCHAR (max) sta permettendo di specificare un valore che è più lungo del tipo di dati specificato, che è il motivo per cui si ottiene l'errore circa troncamento

Altri suggerimenti

L'errore lo dice da sola, "Stringa o dati binari verrebbero troncati". Questo significa che ti sembra di inserire un valore maggiore di quello che il nvarchar(max) in grado di gestire.

SSMS 2008 ha alcune caratteristiche di debug che consente di impostare punti di interruzione, ecc.

Credo che si potrebbe desiderare di prendere un occhio alla capacità massima System.String neanche. Questa è solo una questione di lunghezza, da qualche parte.

Con la vostra stessa identica stored procedure e la tabella che hai descritto mi sono imbattuto il seguente codice

class Program
    {
    static void Main(string[] args)
    {

        using(SqlConnection cnn = new SqlConnection(@"Server=.;Database=test;Trusted_Connection=True;"))
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand("updateTable",cnn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@columnName",
                   System.Data.SqlDbType.NVarChar, 128));

            cmd.Parameters["@columnName"].Value = "BigNvarcharValue";

            cmd.Parameters.Add(new SqlParameter("@value",  
                     System.Data.SqlDbType.NVarChar, -1));
            cmd.Parameters["@value"].Value = new string('T', 80000);

            cmd.ExecuteNonQuery();



        }

    }
}

Ha funzionato bene. Vorrei esaminare il testo del comando e la raccolta dei parametri (nome e il valore) e verificare ogni è come si pensa che sia.

Grazie a tutti per le risposte. Ho finito per separare aggiornamento della grande colonna a una singola procedura, che ha risolto il problema. Sono sicuro che il colpevole era con l'istruzione CASE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top