Ne yazık ki, ne sebeple olursa olsun, bu bağlamda satır içi bir dönüştürme yapamazsınız ve herhangi bir nedenle tekrar RAISERRORdoğrudan desteklemez float.
Bu cevabın eksiksiz olması için, MSDN'den daha önce gördüğünüz ilgili snippet'i aşağıda bulabilirsiniz (not: 2005'ten 2012'ye kadar belgelerin tüm sürümlerinde aynı metindir):
Her bir ikame parametresi yerel bir değişken veya şu veri türlerinden herhangi biri olabilir: tinyint , smallint , int , char , varchar , nchar , nvarchar , ikili veya varbinary .
Düşünebileceğim tek makul çözüm, RAISERRORçağrıyı sarmak için saklı bir yordam yazmak olacaktır . İşte bir başlangıç noktası:
CREATE PROCEDURE [dbo].[MyRaiserror]
(
@message nvarchar(2048),
@severity tinyint,
@state tinyint,
@arg0 sql_variant = NULL
)
AS
BEGIN
DECLARE @msg nvarchar(MAX) = REPLACE(@message, '%f', '%s');
DECLARE @sql nvarchar(MAX) = N'RAISERROR(@msg, @severity, @state';
DECLARE @int0 int, @char0 nvarchar(MAX), @bin0 varbinary(MAX);
IF (@arg0 IS NOT NULL)
BEGIN
SET @sql += N', ';
IF (SQL_VARIANT_PROPERTY(@arg0, 'BaseType') IN ('tinyint', 'smallint', 'int'))
BEGIN
SET @int0 = CONVERT(int, @arg0);
SET @sql += N'@int0';
END
ELSE IF (SQL_VARIANT_PROPERTY(@arg0, 'BaseType') IN ('binary', 'varbinary'))
BEGIN
SET @bin0 = CONVERT(varbinary(MAX), @arg0);
SET @sql += N'@bin0';
END
ELSE
BEGIN
SET @char0 = CONVERT(nvarchar(MAX), @arg0);
SET @sql += N'@char0';
END
END
SET @sql += N');';
EXEC sp_executesql
@sql,
N'@msg nvarchar(2048), @severity tinyint, @state tinyint, @int0 int, @bin0 varbinary(MAX), @char0 nvarchar(MAX)',
@msg, @severity, @state, @int0, @bin0, @char0;
END
Ne yazık ki, bunu rastgele sayıda parametre için ölçeklemenin kolay bir yolu yok ... Muhtemelen hata ayıklamak için eğlenceli olan kıvrımlı iç içe dinamik SQL kullanılarak yapılabilir. Bunu okuyucu için bir egzersiz olarak bırakacağım.
Kullandığım sql_variantbile değer türleri için, kod tekdüzelik nedenlerden dolayı aynı prosedür her yerde kullanılabilir olacağı varsayımına olan doğrudan desteklenen RAISERROR. Ayrıca, bu uygunsa geçici bir saklı yordam olarak oluşturulabilir .
Bu prosedürü kullanmak şöyle görünecektir:
DECLARE @f float = 0.02345;
DECLARE @i int = 234;
DECLARE @s varchar(20) = 'asdfasdf';
DECLARE @b binary(4) = 0xA0B1C2D3;
DECLARE @d decimal(18, 9) = 152.2323;
DECLARE @n int = NULL;
EXEC [dbo].[MyRaiserror] N'Error message with no params.', 10, 1;
EXEC [dbo].[MyRaiserror] N'Float value = %f', 10, 1, @f;
EXEC [dbo].[MyRaiserror] N'Int value = %i', 10, 1, @i;
EXEC [dbo].[MyRaiserror] N'Character value = %s', 10, 1, @s;
EXEC [dbo].[MyRaiserror] N'Binary value = %#x', 10, 1, @b;
EXEC [dbo].[MyRaiserror] N'Decimal value = %f', 10, 1, @d;
EXEC [dbo].[MyRaiserror] N'Null value = %i', 10, 1, @n;
Çıktı:
Error message with no params.
Float value = 0.02345
Int value = 234
Character value = asdfasdf
Binary value = 0xa0b1c2d3
Decimal value = 152.232300000
Null value = (null)
Böylece net sonuç şamandıralar için biçimlendirme yeteneğine sahip olmamanız (kendiniz yuvarlamanız), ancak diğer türler için biçimlendirme yeteneğini korurken bunları çıktılama yeteneğini (ondalık / sayısal!) Elde etmenizdir.