![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
calculate string SQL server 20005 [MSSQL]
Memed_1971 © (2007-10-02 08:21:00)U menya est expression v formate string ( naprimer '100/500*(5+12)')
xochu v odnoy function poluchit resutat etogo expretiona.
pri pomosi komandi exec etot expretion vipolniyaetsa no nikak resultat ne mogu na peremenniyu vzyat sp_execsql normalno raboptaet no v funkchii ne razresaetsya ego ispolzovanie. Mne nujen chtobi eto bila v SQL servere
b z (2007-10-02 17:32:00) [1]
> Memed_1971 (02.10.07 17:11) [8]
http://msdn2.microsoft.com/ru-ru/library/ms186755.aspx
оттуда
EXTERNAL NAME ... Если имя класса через точку (.) предваряется квалификатором пространства имен, то оно должно быть заключено в квадратные скобки ([ ]) или двойные кавычки (" ")...
там и пример есть
Memed_1971 (2007-10-02 17:11:00) [2]EXTERNAL NAME ArithmeticCalculations.ArithmeticCalculations.EvluateArithmethicExpression
Asmname.Classname.Functionname
b z (2007-10-02 16:59:00) [3]
> Memed_1971 (02.10.07 16:49) [6]
а если так
EXTERNAL NAME ArithmeticCalculations.ArithmeticCalculations.ArithmeticCalculations.EvaluateAri thmethicExpression
или
EXTERNAL NAME [ArithmeticCalculations].[ArithmeticCalculations.ArithmeticCalculations].[Evalua teArithmethicExpression]
?
Memed_1971 (2007-10-02 16:49:00) [4]sp_executesql probival ne rasresaet daet msg chto v funkchii ne rasresaetsya ispozovanie procedur ili extended function. ya daje probival cherez Exec Vipolnit i zapisat v temp table v funkchii ne razresaetsya Insert Update Delete. vezde tolko ukazivaetsya chto doljen sozdat Assembly. Takoy kod nasel(kod sverxu) sozdal dll no nikak ne mogu vipolnik komandu
CREATE FUNCTION EvaluateArithmethicExpression (
@p_formula VARCHAR(500))
RETURNS BIT
EXTERNAL NAME ArithmeticCalculations.ArithmeticCalculations.EvaluateArithmethicExpression
daet osibku chto ne mojet naxodit class ArithmeticCalculations a tam etot class est.
Gadenysh (2007-10-02 16:41:00) [5]
> Memed_1971 (02.10.07 16:38) [3]
ты хоть бы попробовал готовый код [2], а потом говорил, разрешается или нет
Memed_1971 (2007-10-02 16:38:00) [6]sp_executesql ne razresatesya izpolzovat v funkchii....
stone (2007-10-02 16:38:00) [7]
> Memed_1971 (02.10.07 16:38) [3]
> sp_executesql ne razresatesya izpolzovat v funkchii....
>
ты вот то что синеньким написано запусти на выполнение
stone (2007-10-02 16:32:00) [8]
> sp_execsql normalno raboptaet no v funkchii ne razresaetsya
> ego ispolzovanie
это кто тебе такое сказал?
К тому же, кто мешает обернуть все это в процедуру с out-параметрами?
Ну если уж очень хочется именно функцию...
create function test_expr
(@Expr nvarchar(max))
returns float
AS
BEGIN
declare
@result float,
@sql nvarchar(max)
set @sql = N'select @result_out = ' + @Expr
EXECUTE sp_executesql @sql, N'@result_out float output', @result_out = @result OUTPUT;
return @Result
END
go
declare
@result float
exec @result = dbo.test_expr '100/500.00*(5+12)'
select @result
Memed_1971 (2007-10-02 16:19:00) [9]nasel odnu C# funkchiyu. no nikak ne mogu pribavit eto v spisok funkchii
CREATE FUNCTION EvaluateArithmethicExpression (
@p_formula VARCHAR(500))
RETURNS BIT
EXTERNAL NAME ArithmeticCalculations.ArithmeticCalculations.EvaluateArithmethicExpression
Daet asibku Msg 6505, Level 16, State 1, Procedure EvaluateArithmethicExpression, Line 1
Could not find Type 'ArithmeticCalculations' in assembly 'ArithmeticCalculations'.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Xml;
using System.Xml.XPath;
using System.IO;
using System.Text.RegularExpressions;
namespace ArithmeticCalculations
{
public partial class ArithmeticCalculations
{
// dummy doc for XPath eval's
static readonly XPathDocument xpdoc;
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlDouble EvaluateArithmethicExpression(SqlString expression)
{
// give me a null and you will get on back
if (expression.IsNull)
{
return SqlDouble.Null;
}
// use regex's to convert typical arithmetic ops to the ones XPath likes
// also force the result to be a double
String useExpression = "number(" + Regex.Replace(expression.Value, "/", " div ") + ")";
useExpression = Regex.Replace(useExpression, "%", " mod ");
XPathNavigator nav = xpdoc.CreateNavigator();
SqlDouble retval = SqlDouble.Null;
try
{
retval = (Double)nav.Evaluate(useExpression);
}
catch
{
// if its not a plain ol' arithmetic expression
// you will get a null back
retval = SqlDouble.Null;
}
return retval;
}
};
}