none
¿Que significa '%.*ls'? RRS feed

  • Pregunta

  • Buen día para todos.

    Pues estoy haciendo un SP y en la siguiente linea me sale un error.

    RAISERROR (@errorMessage, 14, 1, @x, @y, @z);

    El error es: The data type of substitution parameter 2 does not match the expected type of the format specification.

    @errormessage obtiene el valor: Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.

    Y el código completo:

    BEGIN TRY
    			DECLARE @errorMessage VARCHAR(MAX)
    			DECLARE @x NVARCHAR(MAX)
    			DECLARE @y NVARCHAR(MAX)
    			DECLARE @z NVARCHAR(MAX)
    			
    			SET @x = 'UNIQUE KEY';
    			SET @y = 'IX_tbl_Semillera';
    			SET @z = 'dbo.tbl_Semillera';
    			
    			SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033
    			RAISERROR (@errorMessage, 14, 1, @x, @y, @z);
    		END TRY
    		BEGIN CATCH
    			SELECT ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_NUMBER(), ERROR_PROCEDURE()
    		END CATCH

    Agradeceré cualquier ayuda


    • Editado jeduardonl martes, 4 de agosto de 2015 16:57
    martes, 4 de agosto de 2015 16:51

Respuestas

  • Gracias a todos, finalmente di con la respuesta.

    Si se especifica un asterisco (*) para el ancho o la precisión de una especificación de conversión, el valor que se utilizará para el ancho o la precisión se especifica como un valor de argumento entero. En este caso, una especificación de conversión puede utilizar hasta tres argumentos, uno para el valor de ancho, uno para el valor de precisión y uno para el valor de sustitución.

    RAISERROR statements return the same string." id="mt122" xml:space="preserve">Por ejemplo, las dos instrucciones RAISERROR siguientes devuelven la misma cadena. Una especifica los valores de ancho y precisión en la lista de argumentos y la otra en la especificación de conversión.

    RAISERROR (N'<<%*.*s>>', -- Message text.            10, -- Severity,            1, -- State,            7, -- First argument used for width.            3, -- Second argument used for precision.            N'abcde'); -- Third argument supplies the string. -- The message text returned is: << abc>>.

    Entonces mi ejemplo quedo de la siguiente forma:

    BEGIN TRY
    			DECLARE @errorMessage VARCHAR(MAX)
    			DECLARE @x VARCHAR(MAX)
    			DECLARE @y NVARCHAR(MAX)
    			DECLARE @z NVARCHAR(MAX)
    			
    			SET @x = 'UNIQUE KEY';
    			SET @y = 'IX_tbl_Semillera';
    			SET @z = 'dbo.tbl_Semillera';
    			
    			SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033
    			RAISERROR (@errorMessage, 14, 1, @x, 16, @y, 17, @z);
    		END TRY
    		BEGIN CATCH
    			SELECT ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_NUMBER(), ERROR_PROCEDURE()
    		END CATCH

    • Marcado como respuesta jeduardonl martes, 4 de agosto de 2015 23:13
    martes, 4 de agosto de 2015 23:12

Todas las respuestas

  • Saludos:

    La variable SET @x = 'UNIQUE KEY';  debe ser del mismo tipo que el campo al cual esta afectando.

    @errormessage obtiene el valor: Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.

    Esto quiere decir que al construir el indice sobre el campo se encuentran valores duplicados. Esto es tipico de la creacion de indices unicos DESPUES de tener datos en la table.

    Debes revisar la tabla (un SELECT del campo con ORDER BY y HAVING) para verificar los duplicados. Algo asi:

    SELECT name, COUNT(last_name) AS Qty
    FROM MyTable
    ORDER BY 2
    HAVING Qty > 1
    GROUP BY 1

    Espero ayude.

    JOSE LUIS


    Dios NO los llamo LAS DIEZ RECOMENDACIONES

    martes, 4 de agosto de 2015 18:23
  • Gracias, pero creo que no entendiste nada de mi problema, no estoy afectando ningun campo, puse el código completo y la linea donde el error sucede. Sabiendo que significa '%.*ls' puedo resolver mi problema. ¿Alguna otra idea?
    martes, 4 de agosto de 2015 18:58
  • Hola,

    Exactamente que es lo que deseas hacer, al invocar RAISERROR dispara un error que configuremos ahí, es lo mismo que Throw con SQL Server 2012, generalmente esta sentencia se pone en la parte de CATCH..., podrías especificar que escenario deseas manejar y mover tu sentencia a la parte de CATCH.

    Prueba:

    BEGIN TRY
    		DECLARE @errorMessage VARCHAR(MAX)
    		DECLARE @x NVARCHAR(MAX)
    		DECLARE @y NVARCHAR(MAX)
    		DECLARE @z NVARCHAR(MAX)
    			
    		SET @x = 'UNIQUE KEY';
    		SET @y = 'IX_tbl_Semillera';
    		SET @z = 'dbo.tbl_Semillera';
    			
    		SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033
    		
    END TRY
    BEGIN CATCH
    	--SELECT ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_NUMBER(), ERROR_PROCEDURE()
    	RAISERROR (@errorMessage, 14, 1, @x, @y, @z);
    END CATCH

    Saludos!


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    • Editado Nathán XS martes, 4 de agosto de 2015 20:37
    martes, 4 de agosto de 2015 20:37
  • Lo que quiero es lanzar un error desde el try y lo que pase en el catch ya no me importa, pero no puedo lanzar el error por que me sale el error que antes dije.

    Para simplificar el problema elimino el try/catch, el siguiente código genera un error, ¿como puedo solucionar dicho error?

    DECLARE @errorMessage VARCHAR(MAX)
    			DECLARE @x NVARCHAR(MAX)
    			DECLARE @y NVARCHAR(MAX)
    			DECLARE @z NVARCHAR(MAX)
    			
    			SET @x = 'UNIQUE KEY';
    			SET @y = 'IX_tbl_Semillera';
    			SET @z = 'dbo.tbl_Semillera';
    			
    			SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033
    			RAISERROR (@errorMessage, 14, 1, @x, @y, @z);
    El error es: The data type of substitution parameter 2 does not match the expected type of the format specification.

    • Editado jeduardonl martes, 4 de agosto de 2015 21:08
    martes, 4 de agosto de 2015 21:02
  • Que tal,

    Como es un error del Sistema el que deseas mostrar, este tiene comodines para representar mejor el mensaje de error en tiempo de ejecución y no tiene el formato correcto cuando usas RAISERROR. Prueba así:

    DECLARE @errorMessage VARCHAR(MAX)
    			DECLARE @x NVARCHAR(MAX)
    			DECLARE @y NVARCHAR(MAX)
    			DECLARE @z NVARCHAR(MAX)
    			
    			SET @x = 'UNIQUE KEY';
    			SET @y = 'IX_tbl_Semillera';
    			SET @z = 'dbo.tbl_Semillera';
    			
    			SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033
    			SET @errorMessage = REPLACE(@errorMessage, '%',' ')
    			RAISERROR (@errorMessage, 
    						14, 
    						1, 
    						@x, 
    						@y, 
    						@z);

    Saludos!


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    • Editado Nathán XS martes, 4 de agosto de 2015 21:32
    martes, 4 de agosto de 2015 21:30
  • No puedo hacer eso, si elimino el simbolo porcentual de @errorMessage dejara de funcionar la sustitucion de parametros.

    Con esta consulta

    SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033

    obtengo este valor que se almacena en @errorMessage:

    Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'

    Internamente el RAISEERROR que he colocado modificara @errorMessage para que quede de la siguiente forma:

    Violation of UNIQUE KEY constraint 'IX_tbl_Semillera'. Cannot insert duplicate key in object 'dbo.tbl_Semillera'

    sin embargo, solo el primer parametro de sustitucion es remplazado y surge un error al tratar de remplazar el segundo parametro de sustitucion como se describe en el error: The data type of substitution parameter 2 does not match the expected type of the format specification.

    Observen que el primer parametro de sustitucion (el que si funciona) es diferente a los otros 2:

    1.- %ls

    2.- %.*ls

    3.- %.*ls

    Agradecere cualquier ayuda


    • Editado jeduardonl martes, 4 de agosto de 2015 22:00
    martes, 4 de agosto de 2015 21:58
  • RAISERROR, realiza el reemplazo pero con ciertas características en los comodines,

    Prueba de esta forma:

    DECLARE @errorMessage VARCHAR(MAX)
    			DECLARE @x NVARCHAR(MAX)
    			DECLARE @y NVARCHAR(MAX)
    			DECLARE @z NVARCHAR(MAX)
    			
    			SET @x = 'UNIQUE KEY';
    			SET @y = 'IX_tbl_Semillera';
    			SET @z = 'dbo.tbl_Semillera';
    			
    			SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033			
    			SET @errorMessage = REPLACE(@errorMessage, '%ls','%s');
    			SET @errorMessage = REPLACE(@errorMessage, '%.*ls','%s')
    			RAISERROR (@errorMessage, 
    						14, 
    						1, 
    						@x, 
    						@y, 
    						@z);
    

    Si tienes alguna pregunta no dudes en hacerla,

    Saludos!


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    martes, 4 de agosto de 2015 22:22
  • Gracias a todos, finalmente di con la respuesta.

    Si se especifica un asterisco (*) para el ancho o la precisión de una especificación de conversión, el valor que se utilizará para el ancho o la precisión se especifica como un valor de argumento entero. En este caso, una especificación de conversión puede utilizar hasta tres argumentos, uno para el valor de ancho, uno para el valor de precisión y uno para el valor de sustitución.

    RAISERROR statements return the same string." id="mt122" xml:space="preserve">Por ejemplo, las dos instrucciones RAISERROR siguientes devuelven la misma cadena. Una especifica los valores de ancho y precisión en la lista de argumentos y la otra en la especificación de conversión.

    RAISERROR (N'<<%*.*s>>', -- Message text.            10, -- Severity,            1, -- State,            7, -- First argument used for width.            3, -- Second argument used for precision.            N'abcde'); -- Third argument supplies the string. -- The message text returned is: << abc>>.

    Entonces mi ejemplo quedo de la siguiente forma:

    BEGIN TRY
    			DECLARE @errorMessage VARCHAR(MAX)
    			DECLARE @x VARCHAR(MAX)
    			DECLARE @y NVARCHAR(MAX)
    			DECLARE @z NVARCHAR(MAX)
    			
    			SET @x = 'UNIQUE KEY';
    			SET @y = 'IX_tbl_Semillera';
    			SET @z = 'dbo.tbl_Semillera';
    			
    			SELECT @errorMessage = [text] FROM [master].[sys].[messages] WHERE [message_id] = 2627 AND [language_id] = 1033
    			RAISERROR (@errorMessage, 14, 1, @x, 16, @y, 17, @z);
    		END TRY
    		BEGIN CATCH
    			SELECT ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_NUMBER(), ERROR_PROCEDURE()
    		END CATCH

    • Marcado como respuesta jeduardonl martes, 4 de agosto de 2015 23:13
    martes, 4 de agosto de 2015 23:12