Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
гр к
Guest
Насколько я понял, ни CAST ни CONVERT не позволяют на раз из строки цифр и букв получить только числовое значение слева подряд. Ну там из '12-1-1' получить 12, из '45a' 45 и тп.
Может у кого есть шустрая реализация, поделитесь?
15 сен 15, 07:49    [18149361]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
DECLARE @Str VARCHAR(10) = '12-1-1';
SELECT SUBSTRING(@str, 1, PATINDEX('%[^0-9]%', @Str) - 1);

Это одно из направлений куда можно копать.
15 сен 15, 08:18    [18149406]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Делов-то:

DECLARE
	@str	VARCHAR(MAX)	= '1-23-456',
	@newstr	VARCHAR(MAX)	= '',
	@i		INT				= 1,
	@chr	CHAR(1);

WHILE @i <= LEN(@str) BEGIN
	SET @chr = SUBSTRING(@str, @i, 1);
	IF @chr BETWEEN '0' AND '9'
		SET @newstr = @newstr + @chr;
	SET @i = @i + 1;
END;

SELECT CAST(@newstr AS INT)
15 сен 15, 08:38    [18149459]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Подправил форматирование:

DECLARE
    @str    VARCHAR(MAX) = '1-23-456',
    @newstr VARCHAR(MAX) = '',
    @i      INT          = 1,
    @chr    CHAR(1);

WHILE @i <= LEN(@str) BEGIN
    SET @chr = SUBSTRING(@str, @i, 1);
    IF @chr BETWEEN '0' AND '9'
        SET @newstr = @newstr + @chr;
    SET @i = @i + 1;
END;

SELECT CAST(@newstr AS INT)
15 сен 15, 08:39    [18149470]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
В виде scalar UDF:

ALTER FUNCTION dbo.fn_extract_digits (@str VARCHAR(MAX))
RETURNS INT
AS
BEGIN
	DECLARE
		@newstr VARCHAR(MAX) = '',
		@i INT = 1,
		@chr CHAR(1);

	WHILE @i <= LEN(@str) BEGIN
		SET @chr = SUBSTRING(@str, @i, 1);
		IF @chr BETWEEN '0' AND '9' SET @newstr = @newstr + @chr;
		SET @i = @i + 1;
	END;

	RETURN CAST(@newstr AS INT);
END;
GO

DECLARE @str VARCHAR(MAX) = '1-23-456';
SELECT Digits = dbo.fn_extract_digits(@str);
[/quote]
15 сен 15, 08:59    [18149588]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
гр к
Guest
angel_zar
DECLARE @Str VARCHAR(10) = '12-1-1';
SELECT SUBSTRING(@str, 1, PATINDEX('%[^0-9]%', @Str) - 1);

Это одно из направлений куда можно копать.

ок, вроде работает. спасибо
Yuri Abele
Делов-то:
...

Это наверное дольше будет, чем ч-з 1 вар-т?
15 сен 15, 09:14    [18149666]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
гр к
angel_zar
DECLARE @Str VARCHAR(10) = '12-1-1';
SELECT SUBSTRING(@str, 1, PATINDEX('%[^0-9]%', @Str) - 1);


Это одно из направлений куда можно копать.

ок, вроде работает. спасибо
Yuri Abele
Делов-то:
...

Это наверное дольше будет, чем ч-з 1 вар-т?

Я думаю наоборот.
Варианту с PATINDEX итеративно придется перебирать всю строку пока PATINDEX не скажет, что ничего больше не нашел. Т.е. тоже цикл, бесконечный, пока не выправит строку.
В моём варианте перебори символов строки произойдет только один раз.

Тут другой вопрос. Если тебе надо натравливать такую UDF на здоровенную таблицу, то тормозить будет то что это вообще SCALAR UDF. Тебе её надо в INLINE TABLE UDF преобразовывать.
См. тут: MSSQL - Performance tuning of Scalar-Value User Defined Functions (UDFs)
15 сен 15, 09:23    [18149714]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Yuri Abele
Варианту с PATINDEX итеративно придется перебирать всю строку пока PATINDEX не скажет, что ничего больше не нашел. Т.е. тоже цикл, бесконечный, пока не выправит строку.
В моём варианте перебори символов строки произойдет только один раз.


С чего вдруг, он возвращает первую позицию найденного вхождения, в данном случае не цифра, на фига ей перебирать всю строку (хотя хз, что могло взбрести в голову разрабам из МС), а вообще можно оценить по плану, что затратней.

Кстати вопрос к тсу, что должно получится если на входе '-156jfs54' ?
15 сен 15, 10:04    [18149904]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
гр к
Guest
Недавно 1 раз возникла задача апдейта таблицы по условию вхождения левой цифровой части в диапазон.
Многоквартирный дом, в завис-ти от номера квартиры (попадания в интервал 1-20, 21-40 ...) нужно атрибуты абонента откорректировать. А квартиры, внезапно, кроме ведущих цифр могут иметь и нецифровые символы.
У коллеги позаимствовал ф-ю, подобную приведенной юзером Yuri Abele.
Но мне казалось, что какой-то быстрый вар-т с чем-то вроде "regexp_like" должен быть. Типа приведенного angel_zar.
angel_zar
Кстати вопрос к тсу, что должно получится если на входе '-156jfs54' ?

Должен вернуться НУЛЛ. Для целей апдейта '-156jfs54' инвалидный номер квартиры.
15 сен 15, 11:48    [18150435]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
гр к
... левой цифровой части ...

angel_zar
С чего вдруг, он возвращает первую позицию найденного вхождения, в данном случае не цифра, на фига ей перебирать всю строку


В такой постановке да, PATINDEX эффективнее. Я задачу неправильно понял. Моя UDF все цифры вытаскивает, а не только до первой НЕцифры
15 сен 15, 11:53    [18150467]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Yuri Abele
В такой постановке да, PATINDEX эффективнее. Я задачу неправильно понял. Моя UDF все цифры вытаскивает, а не только до первой НЕцифры
Даже если взять вместо вашей UDF обычную заглушку, она все равно проиграет patindex. Потому что главная проблема UDF - очень затратный вызов.
+
use tempdb;
go

create table dbo.t (id int identity primary key, s varchar(50));
go

insert into dbo.t
select top (10000)
 newid()
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

CREATE FUNCTION dbo.fn_extract_digits (@str VARCHAR(8000))
RETURNS INT
AS
BEGIN
return 0;
/*
	DECLARE
		@newstr VARCHAR(8000) = '',
		@i INT = 1,
		@chr CHAR(1);

	WHILE @i <= LEN(@str) BEGIN
		SET @chr = SUBSTRING(@str, @i, 1);
		IF @chr BETWEEN '0' AND '9' SET @newstr = @newstr + @chr
		SET @i = @i + 1;
	END;

	RETURN CAST(@newstr AS INT);
*/
END;
go

declare @v int;

set statistics time on;

select @v = cast(left(s, nullif(patindex('%[^0-9]%', s) - 1, 0)) as int) from dbo.t;
select @v = dbo.fn_extract_digits(s) from dbo.t;

set statistics time off;
go

drop function dbo.fn_extract_digits;
drop table dbo.t;
go

 Время работы SQL Server:
Время ЦП = 16 мс, затраченное время = 16 мс.

Время работы SQL Server:
Время ЦП = 31 мс, затраченное время = 25 мс.
15 сен 15, 12:14    [18150587]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4901
гр к
Ну там из '12-1-1' получить 12, из '45a' 45 и тп.


Это одна из тех вещей, которые на уровне БД точно делать не надо.

если вам надо непременно это иметь, то рекомендую взять какую-нибудь библиотеку на C#, которая умеет это делать и обернуть её CLR функцией.

https://github.com/davideicardi/DynamicExpresso (навскидку, можно поискать ещё)

Но тут надо задаться вопросом, а всё ли у вас правильно по архитектуре.
15 сен 15, 12:22    [18150623]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Цикл, CLR для простейшей задачи!
Куда мы катимся!

Ща курсор напишу
15 сен 15, 12:27    [18150654]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
invm
Даже если взять вместо вашей UDF обычную заглушку, она все равно проиграет patindex. Потому что главная проблема UDF - очень затратный вызов.

Я туплю навреное, но мне показалось, что ваш вариант не вытаскивает все цифры, а только цифры до порвого неправильного символа? Если так, я бы тоже никакую UDF не лепил.
Тут, как немцы говорят, яблоки с грушами сравниваем.
15 сен 15, 12:35    [18150700]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
invm
Даже если взять вместо вашей UDF обычную заглушку, она все равно проиграет patindex. Потому что главная проблема UDF - очень затратный вызов.

Я туплю навреное, но мне показалось, что ваш вариант не вытаскивает все цифры, а только цифры до порвого неправильного символа? Если так, я бы тоже никакую UDF не лепил.
Тут, как немцы говорят, яблоки с грушами сравниваем.

Вы напишите вариант без UDF, который все цифры вытащит
15 сен 15, 12:36    [18150706]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
o-o
Guest
Yuri Abele
Вы напишите вариант без UDF, который все цифры вытащит

например, так:
declare @t table (s varchar(100));
insert into @t values ('1-23-456'), ('-156jfs54'), ('aaa'), ('123');

with cte as
(
select s, substring(s, n, 1) as ch, n
from @t cross apply (select n
                     from dbo.nums
                     where n <= len(s)) a
 where substring(s, n, 1) like '[0-9]'                     
 )
 
 
select s ,( select ch as 'text()' from cte t2 where t1.s = t2.s order by n for xml path('') ) as res
from cte t1
group by s;
15 сен 15, 13:00    [18150844]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Yuri Abele
Yuri Abele
пропущено...

Я туплю навреное, но мне показалось, что ваш вариант не вытаскивает все цифры, а только цифры до порвого неправильного символа? Если так, я бы тоже никакую UDF не лепил.
Тут, как немцы говорят, яблоки с грушами сравниваем.

Вы напишите вариант без UDF, который все цифры вытащит
Нет проблем. Сто раз тут писали.
Например: выборка чисел из строки
15 сен 15, 13:05    [18150865]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Уболтали, красноречивые! :-)
15 сен 15, 13:07    [18150874]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
DECLARE @Str varchar(100) = '12-1-1fklw73174yk23q8725';

WITH CTE
	 AS (
	 SELECT 1 AS Num
	 UNION ALL
	 SELECT Num + 1
	 FROM CTE
	 WHERE Num < 100),
	 CTE1
	 AS (SELECT ROW_NUMBER() OVER(ORDER BY NUM DESC) AS PNum, Num, CAST(SUBSTRING(@Str, Num, 1) AS bigint) AS c
		 FROM CTE
		 WHERE LEN(@Str) >= Num AND 
			   SUBSTRING(@Str, Num, 1) BETWEEN '0' AND '9')
	 SELECT SUM(c * POWER(CAST(10 AS bigint), PNum - 1))
	 FROM CTE1;


У меня такая бяка получилась, только полученное число в BIGINT должно влазить, зато без XML. Интересно что быстрее?
15 сен 15, 13:51    [18151211]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
angel_zar
только полученное число в BIGINT должно влазить
Почему не DEC(38,0)?
15 сен 15, 13:53    [18151226]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
iap
Почему не DEC(38,0)?

Ну это пример, я как то даже не подумал в эту сторону, на int ругаться стало, сделал bigint, можно и DECIMAL
15 сен 15, 13:59    [18151268]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
angel_zar
iap
Почему не DEC(38,0)?

Ну это пример, я как то даже не подумал в эту сторону, на int ругаться стало, сделал bigint, можно и DECIMAL
Лидирующие нули потеряются
15 сен 15, 14:01    [18151278]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
iap
Лидирующие нули потеряются

Про это в курсе.
Yuri Abele
RETURN CAST(@newstr AS INT);

Тут тоже теряются.
15 сен 15, 14:05    [18151308]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
o-o
Guest
обещанный тест решений.
на шибко большой таблице боюсь, и без того *все* решения тормозные.
на миллионной таблице с полем varchar(10) вот какие результаты:
o-o Yuri Abele: scalar UDF angel_zar: inline TVF (rec) angel_zar: inline TVF (fixed)
00:14 00:47 01:15 00:29

на миллионной с полем varchar(200)
o-o Yuri Abele: scalar UDF angel_zar: inline TVF (rec) angel_zar: inline TVF (fixed)
01:13 13:45 04:09 00:29


исходные тексты тестируемых:
+
-- (1) o-o
select 
(
  select substring(t.n_str,v.n,1)
  from dbo.Nums_str t join dbo.nums v
              on v.n between 1 and len(t.n_str) and substring(t.n_str,v.n,1) like '[0-9]'
  where t.n = t1.n
  order by v.n
  for xml path('')
 ) 
from dbo.Nums_str t1

-- (2) Yuri Abele, scalar UDF
create FUNCTION dbo.fn_extract_digits_1 (@str VARCHAR(MAX))
RETURNS INT
AS
BEGIN
	DECLARE
		@newstr VARCHAR(MAX) = '',
		@i INT = 1,
		@chr CHAR(1);

	WHILE @i <= LEN(@str) BEGIN
		SET @chr = SUBSTRING(@str, @i, 1);
		IF @chr BETWEEN '0' AND '9' SET @newstr = @newstr + @chr;
		SET @i = @i + 1;
	END;

	RETURN CAST(@newstr AS INT);
END;
GO

-- (3) angel_zar, recursive NUMs generation, inline TVF
create FUNCTION dbo.fn_extract_digits_2 (@str VARCHAR(MAX))
returns table
as
return (
WITH CTE
	 AS (
	 SELECT 1 AS Num
	 UNION ALL
	 SELECT Num + 1
	 FROM CTE
	 WHERE Num < 100),
	 CTE1
	 AS (SELECT ROW_NUMBER() OVER(ORDER BY NUM DESC) AS PNum, Num, CAST(SUBSTRING(@Str, Num, 1) AS bigint) AS c
		 FROM CTE
		 WHERE LEN(@Str) >= Num AND 
			   SUBSTRING(@Str, Num, 1) BETWEEN '0' AND '9')
	 SELECT CAST(SUM(c * POWER(CAST(10 AS bigint), PNum - 1)) AS VARCHAR(20)) as s
	 FROM CTE1);
GO

-- (4) angel_zar, fixed NUMs table, inline TVF
create FUNCTION dbo.fn_extract_digits_3 (@str VARCHAR(MAX))
returns table
as
return (
	WITH 
	CTE1
	AS (SELECT ROW_NUMBER() OVER(ORDER BY n DESC) AS PNum, CAST(SUBSTRING(@Str, n, 1) AS bigint) AS c
	 FROM dbo.nums
	 WHERE LEN(@Str) >= n AND 
		   SUBSTRING(@Str, n, 1) BETWEEN '0' AND '9')
		 SELECT CAST(SUM(c * POWER(CAST(10 AS bigint), PNum - 1)) AS VARCHAR(20)) as s
	 FROM CTE1);
GO


полная портянка статистики 1:
+

set statistics time, io on;

declare @n_str varchar(10);

select @n_str =
(
select substring(t.n_str,v.n,1)
from dbo.Nums_str t join dbo.nums v
on v.n between 1 and len(t.n_str) and substring(t.n_str,v.n,1) like '[0-9]'
where t.n = t1.n
order by v.n
for xml path('')
)
from dbo.Nums_str t1

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'nums'. Scan count 1000000, logical reads 4000000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Nums_str'. Scan count 1, logical reads 3002471, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 14025 ms, elapsed time = 14083 ms. -- 00:14

------------------------------------------------------------------------
select @n_str = dbo.fn_extract_digits_1(n_str)
from dbo.Nums_str;

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'Nums_str'. Scan count 1, logical reads 2471, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 42120 ms, elapsed time = 47047 ms. -- 00:47

------------------------------------------------------------------------
select @n_str = s
from dbo.Nums_str cross apply dbo.fn_extract_digits_2(n_str);

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'Worktable'. Scan count 6, logical reads 2001604, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Nums_str'. Scan count 3, logical reads 2497, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 139215 ms, elapsed time = 75544 ms. -- 01:15

------------------------------------------------------------------------
select @n_str = s
from dbo.Nums_str cross apply dbo.fn_extract_digits_3(n_str);

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'nums'. Scan count 1000000, logical reads 4000000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Nums_str'. Scan count 3, logical reads 2501, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 54241 ms, elapsed time = 29390 ms. -- 00:29

полная портянка статистики 2:
+

set statistics time, io on;

declare @n_str varchar(200);

select @n_str =
(
select substring(t.n_str,v.n,1)
from dbo.Nums_str_200 t join dbo.nums v
on v.n between 1 and len(t.n_str) and substring(t.n_str,v.n,1) like '[0-9]'
where t.n = t1.n
order by v.n
for xml path('')
)
from dbo.Nums_str_200 t1

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'nums'. Scan count 1000000, logical reads 4000000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'nums_str_200'. Scan count 1, logical reads 3026362, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 70965 ms, elapsed time = 73456 ms. -- 01:13

------------------------------------------------------------------------
select @n_str = dbo.fn_extract_digits_1(n_str)
from dbo.Nums_str_200;

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'nums_str_200'. Scan count 1, logical reads 26362, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 701162 ms, elapsed time = 825566 ms. -- 13:45

------------------------------------------------------------------------
select @n_str = s
from dbo.Nums_str_200 cross apply dbo.fn_extract_digits_2(n_str);

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'Worktable'. Scan count 6, logical reads 2001604, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'nums_str_200'. Scan count 3, logical reads 26528, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 417100 ms, elapsed time = 249332 ms. -- 04:09

------------------------------------------------------------------------
select @n_str = s
from dbo.Nums_str_200 cross apply dbo.fn_extract_digits_3(n_str);

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'nums'. Scan count 1000000, logical reads 4000000, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'nums_str_200'. Scan count 3, logical reads 26528, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 626266 ms, elapsed time = 368906 ms. -- 06:08
16 сен 15, 17:11    [18157368]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите реализацию ф-ии Val из VBA на t-sql  [new]
o-o
Guest
извиняюсь, во второй таблице осталось от первого теста в последнем столбце.
должно быть так:
на миллионной с полем varchar(200)
o-o Yuri Abele: scalar UDF angel_zar: inline TVF (rec) angel_zar: inline TVF (fixed)
01:13 13:45 04:09 06:08
16 сен 15, 17:19    [18157408]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить