Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тип возвращаемого значения при обработке выражений / 16 сообщений из 16, страница 1 из 1
13.04.2018, 10:34
    #39629675
sanitar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
Добрый день. Проблема в следующем.
Считываю из xml выражение типа (1+360/3). Это выражение мне нужно обработать и получить float на выходе.

Проблема в том что
Код: sql
1.
  select (1+360/100)


Вернет целое 4

Пробовал так
Код: sql
1.
  select 1.0*(1+360/100)


Вернет то же 4, что логично. Вопрос как без парсинга строки вернуть FLOAT? Заранее какое выражение лежит внутри xml не известно. Теоретически любое выражение.
...
Рейтинг: 0 / 0
13.04.2018, 10:36
    #39629677
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
sanitar,

CAST()
...
Рейтинг: 0 / 0
13.04.2018, 10:38
    #39629678
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
...
Рейтинг: 0 / 0
13.04.2018, 10:41
    #39629683
sanitar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
Чтобы сделать CAST надо ведь парсить выражение!

Код: sql
1.
select CAST((1+360/100) as FLOAT)


выдаст ровно 4.0

Вот это выражение
Код: sql
1.
select (1+CAST(360 as FLOAT)/100)


даст 4.6, но чтобы его выполнить нужно парсить строку на составляющие!
...
Рейтинг: 0 / 0
13.04.2018, 10:45
    #39629686
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
sanitar,

как вы из такого, например xml-я
Код: sql
1.
declare @xml xml='<a>1+360/100</a>'


получаете этот select
Код: sql
1.
select (1+360/100)


?

Динамик СКЛ ?
...
Рейтинг: 0 / 0
13.04.2018, 10:52
    #39629692
sanitar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
court,

делаю проход по таблице и обрабатываю через sp_executesql чтобы посчитать значение выражения но из-за типов на выходе имею не то что нужно.
...
Рейтинг: 0 / 0
13.04.2018, 10:56
    #39629696
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
sanitarcourt,

делаю проход по таблице и обрабатываю через sp_executesql чтобы посчитать значение выражения но из-за типов на выходе имею не то что нужно.ясно, тогда функция вам сильно не навредит :)
fnEval
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create FUNCTION [dbo].[fnEval]
(
	@txt		varchar(4000)		
)
RETURNS varchar(8000) 
as
begin
	declare @Result varchar(8000)
	declare @object int, @object2 int
	declare @hr int

	set @txt='<body><script>document.write(' + @txt + ');</script></body>'

	exec @hr=sp_OACreate 'HTMLfile', @object out
	exec @hr=sp_OAMethod @object, 'write', null, @txt
	exec @hr=sp_OAGetProperty @object, 'body', @object2 out 
	exec @hr=sp_OAGetProperty @object2, 'innerText', @Result out 

	exec @hr=sp_OADestroy @object2
	exec @hr=sp_OADestroy @object
	
	return @Result 
end



Код: sql
1.
2.
3.
4.
5.
6.
declare @xml xml='<a>1+360/100</a>'

select 
	txt	=t.c.value('text()[1]','varchar(100)')	
	,res	=[dbo].[fnEval](t.c.value('text()[1]','varchar(100)'))
from @xml.nodes('a') as t(c)



txtres1+360/1004.6
...
Рейтинг: 0 / 0
13.04.2018, 11:13
    #39629708
sanitar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
court,

Создавать OLE объекты внутри функции? Мне кажется это перебор. Может как-то можно проще все-таки.
...
Рейтинг: 0 / 0
13.04.2018, 11:16
    #39629712
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
court,

изобретательно, только работать это будет не особо быстро

Если скорость всё-таки важна - я бы пошёл по следующему пути:
запилил бы .net сборку с функциями работы с регулярными выражениями (она вообще не помешает и может понадобиться для многих других задач)
и добавлял бы с её помощью ко всем целым числам .0

Если версия 2017 и выше - можно через python - скрипт, там результат деления целых чисел изначально дробный
...
Рейтинг: 0 / 0
13.04.2018, 11:24
    #39629718
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
Собственно говоря, всё портит именно целочисленное деление.
Может, просто тупо заменить "/" на "*1./" ??
...
Рейтинг: 0 / 0
13.04.2018, 11:27
    #39629722
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
iapСобственно говоря, всё портит именно целочисленное деление.
Может, просто тупо заменить "/" на "*1./" ??
Код: sql
1.
2.
3.
4.
DECLARE @SQL NVARCHAR(MAX)=N'SELECT (1+360/100)';
EXECUTE(@SQL);
SET @SQL=REPLACE(@SQL,'/','*1.0/');
EXECUTE(@SQL);
...
Рейтинг: 0 / 0
13.04.2018, 11:29
    #39629724
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
iapiapСобственно говоря, всё портит именно целочисленное деление.
Может, просто тупо заменить "/" на "*1./" ??
Код: sql
1.
2.
3.
4.
DECLARE @SQL NVARCHAR(MAX)=N'SELECT (1+360/100)';
EXECUTE(@SQL);
SET @SQL=REPLACE(@SQL,'/','*1.0/');
EXECUTE(@SQL);

0, конечно, лишний:
Код: sql
1.
2.
3.
4.
DECLARE @SQL NVARCHAR(MAX)=N'SELECT (1+360/100)';
EXECUTE(@SQL);
SET @SQL=REPLACE(@SQL,'/','*1./');
EXECUTE(@SQL);
...
Рейтинг: 0 / 0
13.04.2018, 11:42
    #39629733
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
iap,
ну или так)

отличный вариант, если конечно t-sql-подобных комментариев не будет в выражении /**/
...
Рейтинг: 0 / 0
13.04.2018, 11:53
    #39629746
sanitar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
iap,

Спасибо, наверное так пойдет.
Код: sql
1.
REPLACE(@expr, '/',*1.0/)
...
Рейтинг: 0 / 0
13.04.2018, 12:06
    #39629758
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
навсякий, ещё такой "ход конём" )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare @txt nvarchar(100)='1+360/100'
declare @SQL nvarchar(max)='set @res=(select xz from OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''C:\Temp\test.accdb'';''Admin'';'''',''select '+@txt+' as xz''))'
declare @res float

--print @SQL

--
exec sp_executesql @SQL, N'@res float out', @res=@res out   
select @res as res


res4,6

Но тут и провайдер нужно, что бы был установлен, и "праздно" валяющийся на сервере файлик Акцесса потребуется, и выражение, что бы было "знакомо" Jet-SQL ... :(
...
Рейтинг: 0 / 0
13.04.2018, 13:39
    #39629830
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тип возвращаемого значения при обработке выражений
sanitarВопрос как без парсинга строки вернуть FLOAT?
Не надо боятся парсинга
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
use tempdb;
go

create function dbo.fnConvertExpression
(
 @e varchar(max)
)
returns table
as
return (
 with t as
 (
  select
   b.p, stuff(a.s, b.p + 1, 0, 'e0') as s, 1 as n
  from
   (select @e + '_') a(s) cross apply
   (select patindex('%[0-9][^0-9.]%', a.s)) b(p)
  where
   b.p > 0

  union all

  select
   t.p + a.p + 5, stuff(t.s, t.p + a.p + 5, 0, 'e0'), n + 1
  from
   t cross apply
   (select patindex('%[0-9][^0-9.]%', substring(t.s, t.p + 5, cast(0x7fffffff as int)))) a(p)
  where
   a.p > 0
 )
select top (1)
 left(s, len(s) - 1) as expression
from
 t
order by
 n desc
);
go

declare @s varchar(100) = '(1+360/100)';

select @s;
exec('select ' + @s);

select @s = expression from dbo.fnConvertExpression(@s);
select @s;
exec('select ' + @s);
go

drop function dbo.fnConvertExpression;
go

...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тип возвращаемого значения при обработке выражений / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]