none
Prefijo N en variable NVARCHAR RRS feed

  • Pregunta

  • Aun SP me llega un dato de Tipo Nvarchar en una variable @data_inp declarada de tipo NVARCHAR, cuyo contenido tiene 'Chinese: 客户专属客盒' al insertala en una tabla en donde el campo esta definido de igual forma NVARCHAR, lo guarda 'Chinese: ???', la pregunta es: 

    1.-. Como le asigno a la variable de enyrada del SP el Prefijo N@data_inp ?

    2.- Como en el inserta a la tabla Insert Into Tabla (Coment) Values (N@data_imp) le incorporo el Prefijo N para que la data se guarde correctamente.

    Esto lo pregunto porque en todos los ejemplos encontrado se hacen referencias a valores en duro por ejemplo N'Chinese: 客户专属客盒', pero ninguno utiliza una variable para ser usada en forma dinamia en un SP.

    MUCHAS GRACIAS

    viernes, 24 de mayo de 2019 14:00

Respuestas

  • No Funciona porque insisto no Puedo anteponer desde la llamada al SP o en el SP mismo el Prefijo a la variable de entrada al procedimiento.

    No, no se hace así. En el programa llamante no se antepone el prefijo N, sino que se usan las herramientas y la sintaxis que tenga el lenguaje llamante para meter un valor Unicode dentro del parámetro Esto se hace de manera distinta en cada lenguaje. Por ejemplo, si estuvieses programando en .Net definirías el parámetro así:

    SqlParameter param = new SqlParameter("@texto", SqlDbType.NVarchar, 100).Value="Chinese: 客户专属客盒";

    Aquí es el SqlDbType.NVarchar lo que le dice que el parámetro es Unicode, es decir, es el equivalente a la "N" que pondrías si eso mismo lo hicieses desde el lado servidor. Y la cadena, en este entorno, se escribe "por las buenas", sin ponerle N ni nada, porque el compilador ya entiende directamente el Unicode y sabe pasarla correctamente.

    Lo anterior es C# bajo .NET. No conozco el Powerbuilder, así que no te puedo decir cómo se haría algo equivalente con dicha herramienta, pero en cualquier caso no sería ya un tema de SQL Server, sino un tema de Powerbuilder. Tendrías que preguntarlo en un foro de Powerbuilder y no en el de SQL Server.

    domingo, 26 de mayo de 2019 10:12

Todas las respuestas

  • ¿Y cuál es el COLLATE de la columna, en la tabla?

    -- código #1
    CREATE TABLE MultL (
       Texto1 nvarchar(200) collate Chinese_Simplified_Stroke_Order_100_CI_AI,
       Texto2 nvarchar(200)
    );    
    go

    declare @Texto nvarchar(200);
    set @Texto= N'Chinese: 客户专属客盒';

    INSERT into MultL values (@Texto, @Texto);

    SELECT Texto1, Texto2 from MultL;

    SELECT * from MultL where Texto2 = @Texto;


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    viernes, 24 de mayo de 2019 14:52
  • Gracias Jose por tu ayuda, solo que 
    set @Texto= N'Chinese: 客户专属客盒'; esa variable viene input al procedimirnto almacenado no se llena en forma manual 
    viernes, 24 de mayo de 2019 18:43
  • Gracias Jose por tu ayuda, solo que esa variable viene input al procedimirnto almacenado no se llena en forma manual

    No hay (y no es necesario) declarar un parámetro como N@ data_inp

    Lo que garantiza el correcto almacenamiento es el COLLATE de la columna. Si no se especifica individualmente, entonces es el COLLATE de la base de datos.
    El COLLATE de la instancia afecta el almacenamiento en variables, tablas temporales, etc.

    -- código #2
    CREATE TABLE dbo.MultL (Texto nvarchar(200));
    go
    
    CREATE PROCEDURE dbo.Ins_MultL @data_inp nvarchar(200) as
    begin
    INSERT into dbo.MultL (Texto) values (@data_inp);
    end;
    go
    
    declare @texto nvarchar(200);
    set @texto= N'Chinese: 客户专属客盒';
    
    EXECUTE dbo.Ins_MultL @data_inp= @texto;
    
    SELECT Texto from MultL;
     

    ---

     


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    viernes, 24 de mayo de 2019 22:54
  • MUchas Gracias por tu paciencia, pero hay una parte que tu no me entiendes La variable viene cargada desde una App Power Builder y desde ahí se invoca el Procedimiento por tanto desde aya no se puede setear con el prefijo N como tu lo haces desde el mismo Sql Server set @texto= N'Chinese: 客户专属客盒'; la variable llega sin el seteo de prefijo N, es decir en su contenido llega 'Chinese: 客户专属客盒', la pregunta es como a la variable le asigno el prefijo N, ejemplo puede ser algo asi N@data_inp, para que quede configurada de buena forma y así el sp entienda que es una variable de tipo Nvarchar y grabe los caracteres chinos correctamente.

    Muchas Gracias.


    viernes, 24 de mayo de 2019 23:41
  • No has entendido lo que te dice José Diz. Como él no tiene la aplicación en PowerbBuilder para meterle el valor a la variable, le ha escrito un valor "fijo" en el script SQL para que el script se pueda ejecutar y probar. Fíjate que eso lo hace fuera del procedimiento en la sentencia que llama al procedimiento. El procedimiento en sí mismo recibe la variable ya cargada. Obviamente en tu caso esa variable vendrá desde fuera ya cargada con un valor cuando llames al procedimiento. El fragmento que tiene el ejemplo que hace la llamada (y que es el que tiene "escrita" la variable) no lo vas a utilizar.


    sábado, 25 de mayo de 2019 8:13
  • La variable viene cargada desde una App Power Builder y desde ahí se invoca el Procedimiento

    Si vuelve a leer los mensajes que publiqué, observará que siempre insisto en que compruebe que COLLATE está establecido para la columna que almacena el contenido del parámetro. Además, publiqué el código #2, que es una simulación de lo que nos reporta. Incluso Alberto Población comenta esto en su respuesta.

    ¿Ha probado el código #2? En caso afirmativo, ¿el contenido de la columna de texto se almacenó correctamente?

    Acerca de "La variable viene cargada desde una App Power Builder y desde ahí se invoca el Procedimiento", es información que no teníamos hasta entonces. No conozco el PB pero, buscando, encontré la siguiente documentación: Unicode support in PowerBuilder.

    ---


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sábado, 25 de mayo de 2019 11:35
  • OK, pero debo contarles Que a pesar de la declarcion a nivel de tabla del campo Texto1, como me indicaste, No Funciona porque insisto no Puedo anteponer desde la llamada al SP o en el SP mismo el Prefijo a la variable de entrada al procedimiento. de igual forma deja la data almacenada en la tabla en el campo errónea, campo que se que se definió como :

    Texto1 nvarchar(200) collate Chinese_Simplified_Stroke_Order_100_CI_AI

    y deja el valor guardado en campo Texto1 Chinese: ???,  cuando lo correcto es que debió haber almacenado Chinese: 客户专属客盒

    sábado, 25 de mayo de 2019 15:32
  • No Funciona porque insisto no Puedo anteponer desde la llamada al SP o en el SP mismo el Prefijo a la variable de entrada al procedimiento.

    No, no se hace así. En el programa llamante no se antepone el prefijo N, sino que se usan las herramientas y la sintaxis que tenga el lenguaje llamante para meter un valor Unicode dentro del parámetro Esto se hace de manera distinta en cada lenguaje. Por ejemplo, si estuvieses programando en .Net definirías el parámetro así:

    SqlParameter param = new SqlParameter("@texto", SqlDbType.NVarchar, 100).Value="Chinese: 客户专属客盒";

    Aquí es el SqlDbType.NVarchar lo que le dice que el parámetro es Unicode, es decir, es el equivalente a la "N" que pondrías si eso mismo lo hicieses desde el lado servidor. Y la cadena, en este entorno, se escribe "por las buenas", sin ponerle N ni nada, porque el compilador ya entiende directamente el Unicode y sabe pasarla correctamente.

    Lo anterior es C# bajo .NET. No conozco el Powerbuilder, así que no te puedo decir cómo se haría algo equivalente con dicha herramienta, pero en cualquier caso no sería ya un tema de SQL Server, sino un tema de Powerbuilder. Tendrías que preguntarlo en un foro de Powerbuilder y no en el de SQL Server.

    domingo, 26 de mayo de 2019 10:12