Excepción la ejecución de un procedimiento almacenado con conmutación de caso de C # (T-SQL)

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

  •  26-09-2019
  •  | 
  •  

Pregunta

Tengo una columna NVARCHAR (max) en una tabla y un procedimiento almacenado que actualizar esta columna, así como cualquier otra columna de la tabla utilizando conmutación 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

Todo es bueno si ejecuto este procedimiento desde SQL Server Management Studio con

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

También puede actualizar NombreTabla de código C # usando el mismo procedimiento almacenado, pero cuando se trata de la actualización de esta BigNvarcharValue desde C #, se produce un error con excepción de SQL que "String o datos binarios podrían truncarse". Ahora, pensé que tiene algo que ver con el caso en este procedimiento almacenado, porque cuando rompa a un procedimiento almacenado simple, todo funciona bien:

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

He leído un montón de mensajes en el foro que describen este problema de tratar de insertar un valor grande en la columna NVARCHAR que causaría esta excepción, pero, duerma parece aplicarse.

Soy bastante nuevo a T-SQL, por lo que existe alguna limitación de la propuesta que yo no conozco?

P.S. BigNvarcharValue es NVARCHAR (MAX) y TableName es NVARCHAR (50)

¿Fue útil?

Solución

¿Cuáles son los tipos de datos de las columnas que está tratando con? Porque he reproducido el error al intentar insertar un valor que se permite por NVARCHAR (max) en una columna que es VARCHAR (50).

Para reiterar -. Nvarchar (max) es lo que le permite especificar un valor que es más largo que el tipo de datos declarado, por lo que se obtiene el error sobre el truncamiento

Otros consejos

El error dice que por sí mismo, "String o datos binarios podrían truncarse". Esto significa que se parecen a insertar un valor mayor que lo que el nvarchar(max) puede manejar.

SSMS 2008 tiene algunas características de depuración que permite establecer puntos de interrupción, etc.

Creo que es posible que desee tomar un ojo a la capacidad máxima System.String tampoco. Esta es sólo una cuestión de longitud, en alguna parte.

Con el mismo procedimiento almacenado exacta y la mesa que describes me encontré con el siguiente código

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();



        }

    }
}

Se trabajó muy bien. Me inspeccionar el texto del comando y la colección de parámetros (nombre y valor) y verificar todas es como usted piensa que es.

Gracias a todos por las respuestas. Terminé la separación de actualización de la gran columna a un procedimiento individual, que resolvió el problema. Estoy seguro de que el culpable fue con la instrucción CASE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top