powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Строковые функции Transact-SQL <-> VFP
20 сообщений из 20, страница 1 из 1
Строковые функции Transact-SQL <-> VFP
    #33071105
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дамы и Господа,

Я хотел бы вам предложить следующие строковые функции 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

С наилучшими пожеланиями.
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33075500
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функции 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
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33075542
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемый не смешно
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33075636
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то и я ничего не пойму
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33075774
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to leaf and Sergey Ch
Выполните следующую программу, которая показывает противоречие в работе функций VFP At и Occurs
________________________________________________________________


cSearchExpression = 'ABCA'
cExpressionSearched = 'ABCABCABCA'

?' количество вхождений подстроки ' +cSearchExpression +' в строку '+cExpressionSearched+' , полученное с помощью функции Occurs'
lnIOccurs = Occurs(cSearchExpression , cExpressionSearched ) && display 2
? lnIOccurs
** первая подстрока
lnSrt = At(cSearchExpression, cExpressionSearched, 1)
lnI = 1
?' показывает все подстроки, полученные с помощью функции At'
Do While .Not.Empty(lnSrt)
?' подстрока номер ', lnI, ' начинающаяся с позиции номер ', lnSrt
?Substr( cExpressionSearched, lnSrt, Len(cSearchExpression))
?' оставшаяся строка '
?Space(lnSrt)+Substr( cExpressionSearched, lnSrt)
lnI = lnI + 1
lnSrt = At(cSearchExpression, cExpressionSearched, lnI )
Enddo
lnI = lnI - 1
?'количество подстрок, полученное с помощью функции At', lnI
?' количество подстрок найденных с помощью функции At больше '
?'чем количество подстрок полученных с помощью функции Occurs'
? lnI, Iif(lnI > lnIOccurs , ' > ', Iif(lnI < lnIOccurs, ' < ',' = ')) , lnIOccurs
?' следующее выражение '
?'At(cSearchExpression, cExpressionSearched, Occurs(cSearchExpression, cExpressionSearched) + 1)'
?'непустое - противоречие'
?' функция Occurs возвращает количество вхождение подстроки в строку'
?' функция At возвращает позицию с которой начинается подстрока в строке, '
?'причем третий параметр это номер вхождения подстроки в строку'
?At(cSearchExpression, cExpressionSearched, Occurs(cSearchExpression, cExpressionSearched) + 1)
?'привет, Самой Читающей в Мире Стране'
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076009
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi leaf & Sergey!

Речь идёт об эмуляции фоксовых функций для сервера MS SQL. При решении этой задачи была найдена особенность работы функции OCCURS()
Я не понимаю что вызвало ваше недоумение :)

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076024
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Igor Korolyov
Вы абсолютно правы.
Мне, конечно, сразу следовало привести фрагмент программы,
наглядно показывающий противоречие в работе функций At и Occurs,
с тем чтобы облегчить восприятие. Видимо ни у кого не возникло подобной ситуации на практике, хотя конечно разобраться с этим мне было не просто.
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076167
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor KorolyovРечь идёт об эмуляции фоксовых функций для сервера MS SQL. При решении этой задачи была найдена особенность работы функции OCCURS()
Я не понимаю что вызвало ваше недоумение :)

Лично я стараюсь не использовать пользовательские функции в MS SQL Server... В принципе, пока обходился стандартными... А там уже не за горами версия от 2005 года...

Но а противоречия есть везде - специалисты называют это "особенностями языка" Например, нумерация элементов массивов etc...

P.S. но это мое скромное мнение, не претендующее на истину... Будем знать теперь, что такие функции есть и их можно бесплатно скачать с UT...
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076297
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Sergey_Ch
Очень зря . Во многих случаях пользовательские функции в сиквеле наиболее быстрое,удобное и красивое решение.
Простейший пример - добавление в результат запроса колонки с функцией RAND() . Если писать в лоб то сгенериться одинаковое значение для всех строк, а если через функцию то все тип-топ.
Я уже молчу про inline и table-valued функции.

Вот мне еще приходится писать на Sybase ASE. Там их нет и не придвиться, а очень не хватает :(
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076360
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не смешно в том смысле, склсервер тоже язык не бедный и к чему изобретать велосипед в каждом языке родное надежнее
Лично мне напоминает мне то время когда я не знал фокспро и изобретал разные функции не зная о существовании родных встроеных, а теперь я напрочь о своих разработках
на мой взляд лучше просто изучить подробнее стандартные функции склсервера там должно быть всё ну или почти все
Ну не верю я в то что сервер беднее чем фокспро
Ну а особенности с ними нужно дружить а не воевать
Хотя может конечно я и не прав но это моё мнение
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076433
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой ли?
Набор функций сиквела достаточно скуден.
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33076509
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неужели чего-то нет того что есть в фоксе
Да может здесь я и не прав с сервером работал мало в основном со строковыми функциями но когда работал было вполне достаточно функций
23 строковых функции неужели мало?
Может пример приведете из своего опыта когда что-то сделать невозможно при работе со строками ? Тока так что бы существенно а не особенность работы
Для сравнения у Попова я насчитал 21 функцию правда не сильно внимательно считал
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33077960
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В начальных версиях FoxPro, затем VFP, не было функций GETWORDCOUNT, GETWORDNUM они были в библиотеке Foxtools, без них можно было обойтись, используя стандартные. Не было, кстати, функции ICASE она появилась, начиная с 9 версии. Начиная с шестой версии, многие функции из библиотеки Foxtools стали частью языка.
Если бы существовала острая необходимость в написанных мною функциях Transact-SQL, их написал бы не я, а разработчики SQL Server.
Острой необходимости в них нет, каждый день происходит 40-50 закачек, хотя объявления представлены в разделах скриптов на достаточно популярных форумах, например на
http://www.sqlservercentral.com/scripts/contributions/1488.asp
http://www.databasejournal.com/scripts/article.php/3503581
http://www.sswug.org/scriptmgr/recentscripts.asp .
В мире сотни тысячи пользователей SQL Server, закачали же мои функции за полтора месяца со всех источников, наверное, чуть более 2500.
Я встретил поначалу массу скептических отзывов со стороны многих MVP, встретил, правда и положительные отзывы со стороны тех же MVP, в общем, мнения разделились.
Ну а тот, кому надо, берет и использует, просто многие (кому они действительно могут быть полезными) не знают и не подозревают об их существовании.

To Sergey Ch
’Но а противоречия есть везде - специалисты называют это "особенностями языка"’
Это не вопрос нумерации массивов, наименований имен, обозначений комментариев и т.д.
Предположим, некто пишет цикл
For lnI = 1 to Occurs( Var1, Var2)
?at( Var1, Var2, lnI)
Endfor
Он уверен что Occurs( Var1, Var2) всегда выдает результат соотносящийся с результатами функции at, на некоторых строках найти ошибку будет весьма трудно.

To leaf
“родное надежнее”
При отладке я нашел ошибку в работе функции substring Transact-SQL (на некоторых длинных и экзотических строках), недавно то же самое с функцией replace, но это на моем нелицензионном SQL Servere, Replace к примеру, на другом лицензионном SQL Servere моего знакомого работает нормально,
Функцию substring на других лицензионных SQL Server ах я пока не проверял.
Именно по причине большого количества дешевых поделок, умные люди не используют, «Функции», «библиотеки» в большом количестве встречающиеся в Интернете. Начинаешь что-нибудь ставить, а оно не устанавливается, как можно этому доверять. Как можно доверять серьезные приложения функциям написанным неизвестно кем? Поэтому со скептицизмом встречают мои функции, но они потихоньку находят своих пользователей, после публикации на серьезных форумах число скептиков уменьшилось, по существу возразить никто не может.
Идея тестирования моих функций очень проста - формируются случайные строки случайной длины, и затем сравниваются результаты работы встроенных функций VFP и UDF Transact-SQL. Я прогнал тесты несколько сотен тысяч раз, перед тем как попытался разместить их в разделе Downloads форума Universalthread.
Код открыт и всегда можно убедится в его корректности.
Так что все работает в соответствии со спецификацией VFP, за исключение того, что мои функции работаю и со строками в UNICODE, то есть к примеру с символами китайского языка, я размешал их и на китайском форуме SQL Servere
Анонс выглядит так –

一些用途 Transact-SQL <-> Visual FoxPro

女士们和先生们
我想向你们建议下面一些用涂 Transact-SQL

加载一些卡片
http://www.universalthread.com/wconnect/wc.dll?LevelExtreme~2,2,27115

你们同意吗
:-)


To leaf
«Ну не верю я в то что сервер беднее чем фокспро»
Это не вопрос веры, а всего лишь знания, функций
GETWORDCOUNT, GETWORDNUM, AT, RAT, OCCURS, PADC, PADR, PADL, PROPER (схожих не по имени, а по функциональности) в Transact-SQL нет, насчет версии 2005 не знаю. Найти какие либо еще отсутствующие функции мне не удалось (если только не считать совсем узкоспециальное типа JUSTNAME и т.д.).

To leaf
»Может пример приведете из своего опыта когда что-то сделать невозможно при работе со строками»
Пример, скорее обратный, показывающий что со строками можно сделать все, немного измененный мною (но не из моего опыта, поскольку если задача встречается часто или может в будущем встретится часто, я предпочитаю писать процедуру или функцию)

На microsoft.public.sqlserver.programming некто Dave 24 апреля 2005 года спрашивает (ему видимо лень, было, обходится встроенными функциями или заходить на www.google.com набирать в строке поиска User-Defined string functions Transact-SQL)

How can I use the T-SQL string functions to find the _third_ occourance of a
character.
For example, I have an email field and it has data that looks like this:
http://www.sqlservercentral.com/scripts/contributions/1488.asp
I want to find the position of the third occurence of '/' so I can use its
position to extract just the main domain name, truncating all the trailing
garbage.
Does anyone have any ideas on how to do this?

Ему, естественно, с готовностью помогают, демонстрируя возможность обойтись встроенными функциями (действительно можно, нет никаких сомнений)
____________________________________________________________
Dave,
Here's an example that should help you out:
declare @t table (
s nvarchar(1000) )
insert into @t values (‘http://www.sqlservercentral.com/scripts/contributions/1488.asp')
insert into @t values
('http://www.sqlservercentral.com/scripts/contributions/1488.asp')
select
substring(s,a,charindex('/',s,a)-a) as theDomain
from (
select
s,
charindex('//',s) + 2 as a
from @t
)

Steve Kass
Drew University
____________________________________________________________
Далее Dave благодарит за ценный совет, но получает еще один
____________________________________________________________
This should extract the Domain Name...

Declare @V VarChar(89)
Set @V = 'http://www.sqlservercentral.com/scripts/contributions/1488.asp'

Select Substring(@V, CharIndex('//', @V) + 2, CharIndex('/',
Substring(@V, CharIndex('//', @V) + 2, Len(@V)))-1)
____________________________________________________________
Ну и, естественно, я вставил свои три копейки
select dbo.AT('/','http://www.sqlservercentral.com/scripts/contributions/1488.asp',3)

Видимо, на нашей планете, можно найти сотни тысяч подобных строк кода
в базах SQL Server (иначе бы мне не говорили спасибо на нескольких языках),
многие ведь нашли решение сами, не спрашивая на форумах.

To leaf
»Ну а особенности с ними нужно дружить а не воевать»
Их нужно сначала знать, для этого и существуют форумы, где обмениваются информацией,
Форумы ведь существуют не только для того чтобы отвечать на вопросы Dave ов. У меня ушло достаточно много времени на то чтобы разобраться, этого не знали даже (теперь знают от меня) гуру от VFP.
____________________________________________________________
Кстати, недавно столкнулся с одной особенностью работы функции
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/
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33078006
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To: Игорь2004

Удачи Вам, чувствуется, что у Вас есть много времени и возможности копать так глубоко. Мне, к сожалению, надо работать на работе, да вот еще статью начал писать...

But anyway, have a nice weekend!
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33078068
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть желание, можешь выложить свои функции на сайте

http://www.foxclub.ru/

В разделе "Решения". Правда, хотелось бы, чтобы их описание было по русски. Очень многие посетители этого сайта с большим трудом вопспринимают английский текст.
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33079605
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не ну чё там убили наповал конечно
SELECT SUBSTRING('abcd', -4, 6 ) -- returns 'a'
это круто
удачи в Вашем труде
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33081123
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Sergey Ch
Вам также удачи и всего доброго
"чувствуется, что у Вас есть много времени и возможности копать так глубоко."
Нет, это конечно не так, просто раз уж я сделал эту работу - она должна быть выполнена безупречно, иначе люди поверившие мне и скачавшие мои функции,
могут потерять время и нервы на поиск ошибок.
Я сделал первый шаг в создании своего имени, естественно мое имя не должно быть связано с ошибками.
"Мне, к сожалению, надо работать на работе, да вот еще статью начал писать..."
Успеха в работе и написании статьи.
to ВладимирМ
"Если есть желание, можешь выложить свои функции на сайте"
Спасибо за предложение, я так и сделаю, ну и еще в ряд форумов, включая этот.
"Правда, хотелось бы, чтобы их описание было по русски. Очень многие посетители этого сайта с большим трудом вопспринимают английский текст."
Ну что же, для многих посетителей сайта, с большим трудом воспринимающих английский текст, я приведу краткое описание на русском
языке.
to leaf
"удачи в Вашем труде"
и Вам также удачи и всего доброго
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33081267
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To leaf
»Может пример приведете из своего опыта когда что-то сделать невозможно при работе со строками» Еще пример, скорее обратный, сделать возможно,
только что случайно наткнулся -
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=49733
Некто JAme задает вопрос
hi,
is there a similar function in SQL server to ORACLES RPAD ?

I need to display a field for a fixed width of 10.
if the field is not 60 then add blank spaces . .
eg:

[jamie ]
[sqlteam ]
[transact-s]

and so on . .. .
thank you for any help/

JAme
*--------------------------------------------------------------
То есть интересуется - имеется ли нечто подобное функции RPAD PL/SQL.
Да, имеется функция PADR, если бы он поискал на том же форуме то нашел бы, опубликовано несколькими днями ранее на том же форуме.

robvolk SQL Server MVP & SQLTeam MVY и прочая и прочая и прочая (всех титулов и званий достаточно много)
начинает давать дельные советы, что то про bcp и т.д. и т.п., разворачиватся оживленная дискуссия его благодарят и т.д. и т.п.
несколькими днями ранее на том же форуме он боролся с перекрестными ссылками, видимо не удосужившись прочитать мой пост.
В общем кому интересно можете почитать.
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33162489
Игорь2004
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"родное надежнее"
Желающие убедиться в том, что родное, к сожалению, не всегда надежнее,
могут выполнить следующие строки в 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
...
Рейтинг: 0 / 0
Строковые функции Transact-SQL <-> VFP
    #33162610
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь совершенно прав: иногда VFP (точнее FP) функций очень не хватает в T-SQL. Я имею в виду именно простейших, скалярных функций, к которым так привык при написании клиента в VFP. Тем более, функций в T-SQL немного и они не всегда также работают, как аналогичные функции в VFP (например, VAL()).
Собственно, в T-SQL UDF и ввели с целью расширенья языка. Полагаю, что любой разработчик кода на T-SQL начинает с того, что расширяет его с помощью UDF.
С уважением, Алексей.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Строковые функции Transact-SQL <-> VFP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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