March 1, 2011 at 10:06 am
Hi. I have a pretty simple piece of C# code:
[SqlFunction(IsDeterministic = true, Name = "ufn_RunningTotalForDecimal")]
public static SqlDecimal RunningTotalsDecimal(SqlDecimal val, SqlByte id, SqlDecimal nullValue)
{
string dataName = string.Format("MulstiSqlRt_{0}_{1}", typeof(SqlByte).FullName, id.IsNull ? 0 : id.Value);
object lastSum = CallContext.GetData(dataName);
SqlDecimal total = lastSum != null ? (SqlDecimal)lastSum : SqlDecimal.Null;
if (!val.IsNull)
total = total.IsNull ? val : total + val;
else
total = total.IsNull ? nullValue : (nullValue.IsNull ? total : total + nullValue);
CallContext.SetData(dataName, total);
return total;
}
}
The problem with this is that when deployed it appears as a function that takes decimal(18,0) for the val and nullValue parameters. I want to have decimal(18,2) instead. How do I change the function above to achieve this?
Thanks.
Best,
Darek
March 1, 2011 at 10:14 am
hi there,
you might want to try this --> [Microsoft.SqlServer.Server.SqlFacet(Precision = 18, Scale = 2)]SqlDecimal val, [Microsoft.SqlServer.Server.SqlFacet(Precision = 18, Scale = 2)]SqlDecimal nullVal
i haven't ever tried this, but sqldecima data type has a precision property as well.
take a look here --> http://www.google.com/#sclient=psy&hl=en&q=sqldecimal+precision&aq=2&aqi=&aql=&oq=&pbx=1&bav=on.1,or.&fp=19d8439716407a1a
good luck,
tonci korsano
March 1, 2011 at 10:30 am
Hi there. Well, it works for the parameters but it doesn't for the outcome, which is marked as illegal when I try to decorate it with the facet... Any other suggestions, please?
March 1, 2011 at 10:41 am
hi again,
i haven't used sqldecimal ever, but if precision property didn't work, you might want to try method SqlDecimal.ConvertToPrecScale() in your return value.
here is an example of this method --> http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldecimal.converttoprecscale(VS.80).aspx
in general, go here --> http://www.google.com/#hl=en&sugexp=ldymls&xhr=t&q=sqldecimal+return+value+precision&cp=33&pf=p&sclient=psy&aq=f&aqi=&aql=&oq=sqldecimal+return+value+precision&pbx=1&bav=on.1,or.&fp=19d8439716407a1a
it looks like that other programmers had to get around to similar problems you have.
good luck,
tonci korsano
March 1, 2011 at 11:52 am
Well, I have found the solution. In short:
[SqlFunction(IsDeterministic = true, Name = "ufn_RunningTotalForDecimal")]
[return: Microsoft.SqlServer.Server.SqlFacet(Precision = 18, Scale = 2)]
public static SqlDecimal RunningTotalsDecimal(
[Microsoft.SqlServer.Server.SqlFacet(Precision = 18, Scale = 2)]
SqlDecimal val,
SqlByte id,
[Microsoft.SqlServer.Server.SqlFacet(Precision = 18, Scale = 2)]
SqlDecimal nullValue
)
{
string dataName = string.Format("MulstiSqlRt_{0}_{1}", typeof(SqlByte).FullName, id.IsNull ? 0 : id.Value);
object lastSum = CallContext.GetData(dataName);
SqlDecimal total = lastSum != null ? (SqlDecimal)lastSum : SqlDecimal.Null;
if (!val.IsNull)
total = total.IsNull ? val : total + val;
else
total = total.IsNull ? nullValue : (nullValue.IsNull ? total : total + nullValue);
CallContext.SetData(dataName, total);
return total;
}
}
That required me to purchase membership on http://www.experts-exchange.com....
Best,
Darek
Viewing 5 posts - 1 through 5 (of 5 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy