Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Строковые функции Transact-SQL  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
Дамы и Господа,

Я хотел бы вам предложить следующие строковые функции Transact-SQL
GETWORDCOUNT() Counts the words in a string
GETWORDNUM() Returns a specified word from a string
AT() Returns the beginning numeric position of the first occurrence of a character expression within
another character expression, counting from the leftmost character
RAT() Returns the numeric position of the last (rightmost) occurrence of a character string within
another character string
OCCURS() Returns the number of times a character expression occurs within another character expression
PADL() Returns a string from an expression, padded with spaces or characters to a specified length on the left side
PADR() Returns a string from an expression, padded with spaces or characters to a specified length on the right side
PADC() Returns a string from an expression, padded with spaces or characters to a specified length on the both sides
PROPER() Returns from a character expression a string capitalized as appropriate for proper names
RCHARINDEX() Is similar to a built-in function Transact-SQL charindex but the search of which is on the right
ARABTOROMAN() Returns the character Roman number equivalent of a specified numeric expression
ROMANTOARAB() Returns the number equivalent of a specified character Roman number expression ...

More than 2000 people have already downloaded my functions. I hope you will find it useful as well.

For more information about string UDFs Transact-SQL please visit the
http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,54,33,27115

Пожалуйста, загрузите файл
http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,2,27115

С наилучшими пожеланиями.
19 май 05, 05:50    [1553493]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
спасибо
19 май 05, 09:26    [1553762]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
chenosov
Member

Откуда: С.Петербург
Сообщений: 272
Спасибо!
По-моему, многие из них были в фоксе? Так?
19 май 05, 09:45    [1553839]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
to iSestrin:
Пожалуйста
to chenosov:
Вы абсолютно правы -
GETWORDCOUNT, GETWORDNUM, AT, RAT, OCCURS, PADC, PADR, PADL, PROPER
были и есть в VFP.
Имена функций, вызов функций (за исключением того, что в вы не можете опускать параметры по умолчанию, поскольку в T-SQL нужно указывать ключевое слово default), результаты работы - совпадают с одноименными функциями VFP.
Есть только одна тонкость: в VFP функция OCCURS подсчитывает количество вхождений подстрок в строку, не учитывая перекрытия (overlaps), то есть
поиск n+1 подстроки в строке начинается
с элемента номер (начало n подстроки + длина подстроки).
Пример: в VFP OCCURS('ABCA', 'ABCABCABCA') -- display 2
-- 1 occurrence of substring 'ABCA .. BCABCA'
-- 2 occurrence of substring 'ABCABC ..ABCA'

Моя функция OCCURS подсчитывает количество вхождений подстрок в строку, учитывая перекрытия (overlaps), то есть
поиск n+1 подстроки в строке начинается
с элемента номер (начало n подстроки + 1).
Пример: select dbo.OCCURS('ABCA', 'ABCABCABCA') -- display 3
-- 1 occurrence of substring 'ABCA .. BCABCA'
-- 2 occurrence of substring 'ABC...ABCA...BCA'
-- 3 occurrence of substring 'ABCABC...ABCA'

То есть в VFP имеется некоторое противоречие -
At(cSearchExpression, cExpressionSearched, Occurs(cSearchExpression, cExpressionSearched) + 1) должно быть всегда равно нулю.
Но в VFP это не всегда так.
Сейчас этот вопрос задан VFP Team, но ответа пока нет.

Для подсчета количества вхождений подстрок в строку, не учитывая перекрытия (overlaps), Stephen Dobson (Toronto), предложил элегантный прием (с моими дополнениями), это выглядит так:

CREATE function OCCURS2 (@cSearchExpression nvarchar(4000), @cExpressionSearched nvarchar(4000))
returns smallint
as
begin
return
case
when datalength(@cSearchExpression) > 0
then ( datalength(@cExpressionSearched)
- datalength(replace(cast(@cExpressionSearched as nvarchar(4000)) COLLATE Latin1_General_BIN,
cast(@cSearchExpression as nvarchar(4000)) COLLATE Latin1_General_BIN, '')))
/ datalength(@cSearchExpression)
else 0
end
end
19 май 05, 17:35    [1556607]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
Кстати, недавно столкнулся с одной особенностью работы функции
substring Transact-SQL.
Особенность эта следующая:
если substr('tra-la-la', 0, 2) VFP возвращает пустую строку, то есть при втором аргументе меньше единицы вседа возвращается пустая строка, то
substring('tra-la-la', 0, 2) Transact-SQL возвращает 't' то есть при втором аргументе меньше единицы нужно смотреть на третий аргумент, и в зависимости от него будет получен результат, скажем,
substring('tra-la-la', -5, 8) Transact-SQL возвращает 'tr' .
Объяснение этому здесь
http://support.microsoft.com/kb/q310421/
20 май 05, 17:00    [1560267]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
Ошибка в Microsoft SQL Server 2000
Желающие убедиться в том, что родное, к сожалению, не всегда надежнее,
могут выполнить следующие строки в SQL Query Analyzer

select right(replace((replicate(N'z',3998)+N'A'), N'A', N'B'),1) -- display B this is correct result
select right(replace((replicate(N'z',3999)+N'A'), N'A', N'B'),1) -- display A but this is incorrect result

то есть, если длина строки 4000 символов, то на последнем символе функция
replace работает неправильно, но это для переменных типа nvarchar,
для переменных же типа varchar все нормально.

select right(replace((replicate('z',7999)+'A'), 'A', 'B'),1) -- display B this is correct result

Я использую Microsoft SQL Server 2000 - 8.00.2039
SELECT @@VERSION -- display Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 2)

SELECT SERVERPROPERTY('Edition') -- display Desktop Engine
SELECT SERVERPROPERTY('ProductLevel') -- display SP4
SELECT SERVERPROPERTY('ProductVersion') -- display 8.00.2039
13 июл 05, 05:43    [1698321]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
321
Member

Откуда:
Сообщений: 85
Скажите пожалуйста, как установить эти функции? Я скопировал dll-ки в c:\windows\system32, а они не регятся (((
как быть?
11 май 06, 12:02    [2651649]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
utmax
Member

Откуда: Коломна
Сообщений: 148
Данные функции работают с MS SQL Server 2000 и MS SQL Server 2005 (Yukon).

Для создания данных функций в нужной Вам базе данных SQL сервера,
запустите SQL Query Analyzer, откройте в нем файл create_udfs_functions.sql и выполните его, нажав F5.
Для удаления данных функции запустите SQL Query Analyzer, откройте файл drop_udfs_functions.sql и выполните его, нажав F5.
11 май 06, 12:40    [2651917]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
321
Member

Откуда:
Сообщений: 85
Запрос не выполняется, вылазит туча ошибок... Перечислять их все не имеет смысла. Наверное я что-то не так делаю?
Вроде все так.. скрипт открываю в нужной базе и т.д...
11 май 06, 13:00    [2652043]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
321
Запрос не выполняется, вылазит туча ошибок... Перечислять их все не имеет смысла. Наверное я что-то не так делаю?
Вроде все так.. скрипт открываю в нужной базе и т.д...

Какой именно запрос не выполняется ?
Перечислите хотя бы одну первую ошибку.
А заодно сообщите версию вашего MSSQL
11 май 06, 13:11    [2652114]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
321
Member

Откуда:
Сообщений: 85
Вот первая ошибка
Server: Msg 131, Level 15, State 3, Procedure CHARINDEX_BIN, Line 51
The size (32767) given to the type 'varchar' exceeds the maximum allowed for any data type (8000).

версия sql:
Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)
11 май 06, 13:17    [2652140]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
А текст запроса ?
11 май 06, 13:21    [2652159]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Игорь2004
...Я хотел бы вам предложить следующие строковые функции Transact-SQL...

For more information about string UDFs Transact-SQL please visit the
http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,54,33,27115

Пожалуйста, загрузите файл
http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,2,27115
Спасибо! Я как раз фокспрошник.
11 май 06, 15:16    [2652978]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Игорь2004
Member

Откуда: Монреаль
Сообщений: 168
to Владимир СА
Пожалуйста, я тоже очень люблю этот язык (FoxPro), но, к сожалению, по крайней мере тех, кто любит этот язык, .Net постепенно убьет все. Хотя, кто знает ...
----------------------------------------------------------------
to 321 Если речь идет о версии для 2005 на CLR, то там DLL с "нетрадиционной" ориентацией, их нужно регистрировать специальными командами на сервере

Для создания данных функций в нужной Вам базе данных SQL сервера 2005, откройте файл
create_udfs_functions_VB.sql (для функций написанных на VB. Net) -- или--
create_udfs_functions_CS.sql (для функций написанных на C#.Net) -- или --
create_udfs_functions_CPP.sql (для функций написанных на C++. Net),
установите путь к DLL библиотеке (udfs_transact-sql_vb.dll для VB. Net, udfs_transact-sql_cs.dll для C#.Net,
udfs_transact-sql_cplusplus.dll для C++. Net) и выполните его, нажав F5.

Для удаления данных функции откройте файл drop_udfs_functions_CLR.sql и выполните его, нажав F5.

to 321
Если же речь идет о версии для 2000, 2005 на обычном Transact-SQL то, Вы взяли версию на Transact-SQL для СУБД Sybase (а еще есть для DB2 и Oracle), поскольку там в СУБД Sybase именно такая размерность и тип переменной 32767 'varchar' и попытались использовать для MS SQL Server.

to All
Мои функции без ошибок, за исключением ошибок проиходящих от ошибок встроенных функции, всех вышеуказаных СУБД, исключая Oracle.
Все выловленные мной ошибки встроенных функций указаны мною в CHM файлах помощи. Кстати, в MS SQL Server 2005 мне удалось найти только одну ошибку, но она весьма экзотическая и в реальной практике не встретится.

С уважением,
Никифоров Игорь.
23 май 06, 05:02    [2693696]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Строковые функции Transact-SQL  [new]
Александр Третьяков
Member

Откуда: Украина, г. Тернополь
Сообщений: 549
может кто-то имеет рабочие ссылки на этот архив?
30 ноя 11, 20:35    [11686086]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Александр Третьяков
может кто-то имеет рабочие ссылки на этот архив?
Рабочую ссылку не имею, но архив прикрепляю…
Т.к. не более 150kb, то разбил на части... Частей 3...

К сообщению приложен файл (UDFs_Transact-SQL.part1.rar - 136Kb) cкачать
1 дек 11, 06:45    [11687228]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915


К сообщению приложен файл (UDFs_Transact-SQL.part2.rar - 136Kb) cкачать
1 дек 11, 06:45    [11687229]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915


К сообщению приложен файл (UDFs_Transact-SQL.part3.rar - 38Kb) cкачать
1 дек 11, 06:46    [11687230]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Медвежья услуга.
Даже если закрыть глаза на проуцедурность кода (можно написать в 100 раз меньше кода, работающего в 100 раз быстрее).
Банально на CLR быстрее проще и понятнее (всётаки 2005 год).
С другой стороны, необходимость таких функций говорит о проблемах как в архитектуре приложения так и понимании имеющихся инструментов.
Один только RegEx сводит на нет всех их. Не говоря о том что SQL не место для таких проблем.

PS: Это не как не отменяет альтруистические побуждений. И использование в административно-экстремальных условиях.
KO.
1 дек 11, 11:05    [11687943]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Mnior
Медвежья услуга.
Даже если закрыть глаза на проуцедурность кода (можно написать в 100 раз меньше кода, работающего в 100 раз быстрее).
Банально на CLR быстрее проще и понятнее (всётаки 2005 год).
С другой стороны, необходимость таких функций говорит о проблемах как в архитектуре приложения так и понимании имеющихся инструментов.
Один только RegEx сводит на нет всех их. Не говоря о том что SQL не место для таких проблем.

PS: Это не как не отменяет альтруистические побуждений. И использование в административно-экстремальных условиях.
KO.
Разговор велся в 2006 году... под SQL2000...
Вы оперируете сегодняшними представлениями... А это разные вещи...
1 дек 11, 11:07    [11687951]     Ответить | Цитировать Сообщить модератору
 Re: Строковые функции Transact-SQL  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Владимир СА
Разговор велся в 2006 году... под SQL2000...
Вы оперируете сегодняшними представлениями... А это разные вещи...
1. Вы же скрипты сейчас выложили! Я просто провёл черту <closed>, <not for use now>.
2. 2000 никак не отмазывает процедурность подхода и отказ от RegEx. Extendet процедуры то на нём никто не отменял.
1 дек 11, 12:49    [11688731]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить