powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тип возвращаемого значения при обработке выражений
16 сообщений из 16, страница 1 из 1
Тип возвращаемого значения при обработке выражений
    #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
Тип возвращаемого значения при обработке выражений
    #39629677
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanitar,

CAST()
...
Рейтинг: 0 / 0
Тип возвращаемого значения при обработке выражений
    #39629678
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тип возвращаемого значения при обработке выражений
    #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
Тип возвращаемого значения при обработке выражений
    #39629686
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanitar,

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


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


?

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

делаю проход по таблице и обрабатываю через sp_executesql чтобы посчитать значение выражения но из-за типов на выходе имею не то что нужно.
...
Рейтинг: 0 / 0
Тип возвращаемого значения при обработке выражений
    #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
Тип возвращаемого значения при обработке выражений
    #39629708
sanitar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

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

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

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

Если версия 2017 и выше - можно через python - скрипт, там результат деления целых чисел изначально дробный
...
Рейтинг: 0 / 0
Тип возвращаемого значения при обработке выражений
    #39629718
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно говоря, всё портит именно целочисленное деление.
Может, просто тупо заменить "/" на "*1./" ??
...
Рейтинг: 0 / 0
Тип возвращаемого значения при обработке выражений
    #39629722
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
Тип возвращаемого значения при обработке выражений
    #39629724
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
Тип возвращаемого значения при обработке выражений
    #39629733
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,
ну или так)

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

Спасибо, наверное так пойдет.
Код: sql
1.
REPLACE(@expr, '/',*1.0/)
...
Рейтинг: 0 / 0
Тип возвращаемого значения при обработке выражений
    #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
Тип возвращаемого значения при обработке выражений
    #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
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Тип возвращаемого значения при обработке выражений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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