|
|
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Дамы и Господа, Я хотел бы вам предложить следующие строковые функции 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 С наилучшими пожеланиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2005, 09:26:03 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Функции 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.2005, 17:43:53 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
уважаемый не смешно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 17:52:15 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Что-то и я ничего не пойму ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 18:24:16 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
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) ?'привет, Самой Читающей в Мире Стране' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2005, 20:18:16 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Hi leaf & Sergey! Речь идёт об эмуляции фоксовых функций для сервера MS SQL. При решении этой задачи была найдена особенность работы функции OCCURS() Я не понимаю что вызвало ваше недоумение :) Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 02:42:31 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
to Igor Korolyov Вы абсолютно правы. Мне, конечно, сразу следовало привести фрагмент программы, наглядно показывающий противоречие в работе функций At и Occurs, с тем чтобы облегчить восприятие. Видимо ни у кого не возникло подобной ситуации на практике, хотя конечно разобраться с этим мне было не просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 04:42:48 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Igor KorolyovРечь идёт об эмуляции фоксовых функций для сервера MS SQL. При решении этой задачи была найдена особенность работы функции OCCURS() Я не понимаю что вызвало ваше недоумение :) Лично я стараюсь не использовать пользовательские функции в MS SQL Server... В принципе, пока обходился стандартными... А там уже не за горами версия от 2005 года... Но а противоречия есть везде - специалисты называют это "особенностями языка" Например, нумерация элементов массивов etc... P.S. но это мое скромное мнение, не претендующее на истину... Будем знать теперь, что такие функции есть и их можно бесплатно скачать с UT... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 09:21:02 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
2Sergey_Ch Очень зря . Во многих случаях пользовательские функции в сиквеле наиболее быстрое,удобное и красивое решение. Простейший пример - добавление в результат запроса колонки с функцией RAND() . Если писать в лоб то сгенериться одинаковое значение для всех строк, а если через функцию то все тип-топ. Я уже молчу про inline и table-valued функции. Вот мне еще приходится писать на Sybase ASE. Там их нет и не придвиться, а очень не хватает :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 10:10:32 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
не смешно в том смысле, склсервер тоже язык не бедный и к чему изобретать велосипед в каждом языке родное надежнее Лично мне напоминает мне то время когда я не знал фокспро и изобретал разные функции не зная о существовании родных встроеных, а теперь я напрочь о своих разработках на мой взляд лучше просто изучить подробнее стандартные функции склсервера там должно быть всё ну или почти все Ну не верю я в то что сервер беднее чем фокспро Ну а особенности с ними нужно дружить а не воевать Хотя может конечно я и не прав но это моё мнение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 10:34:39 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Ой ли? Набор функций сиквела достаточно скуден. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 10:58:08 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
неужели чего-то нет того что есть в фоксе Да может здесь я и не прав с сервером работал мало в основном со строковыми функциями но когда работал было вполне достаточно функций 23 строковых функции неужели мало? Может пример приведете из своего опыта когда что-то сделать невозможно при работе со строками ? Тока так что бы существенно а не особенность работы Для сравнения у Попова я насчитал 21 функцию правда не сильно внимательно считал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 11:18:29 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
В начальных версиях 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/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 18:41:52 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
To: Игорь2004 Удачи Вам, чувствуется, что у Вас есть много времени и возможности копать так глубоко. Мне, к сожалению, надо работать на работе, да вот еще статью начал писать... But anyway, have a nice weekend! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 19:18:23 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Если есть желание, можешь выложить свои функции на сайте http://www.foxclub.ru/ В разделе "Решения". Правда, хотелось бы, чтобы их описание было по русски. Очень многие посетители этого сайта с большим трудом вопспринимают английский текст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2005, 19:55:02 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
не ну чё там убили наповал конечно SELECT SUBSTRING('abcd', -4, 6 ) -- returns 'a' это круто удачи в Вашем труде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2005, 11:33:25 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
to Sergey Ch Вам также удачи и всего доброго "чувствуется, что у Вас есть много времени и возможности копать так глубоко." Нет, это конечно не так, просто раз уж я сделал эту работу - она должна быть выполнена безупречно, иначе люди поверившие мне и скачавшие мои функции, могут потерять время и нервы на поиск ошибок. Я сделал первый шаг в создании своего имени, естественно мое имя не должно быть связано с ошибками. "Мне, к сожалению, надо работать на работе, да вот еще статью начал писать..." Успеха в работе и написании статьи. to ВладимирМ "Если есть желание, можешь выложить свои функции на сайте" Спасибо за предложение, я так и сделаю, ну и еще в ряд форумов, включая этот. "Правда, хотелось бы, чтобы их описание было по русски. Очень многие посетители этого сайта с большим трудом вопспринимают английский текст." Ну что же, для многих посетителей сайта, с большим трудом воспринимающих английский текст, я приведу краткое описание на русском языке. to leaf "удачи в Вашем труде" и Вам также удачи и всего доброго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 05:48:53 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
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 и т.д. и т.п., разворачиватся оживленная дискуссия его благодарят и т.д. и т.п. несколькими днями ранее на том же форуме он боролся с перекрестными ссылками, видимо не удосужившись прочитать мой пост. В общем кому интересно можете почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2005, 09:27:38 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
"родное надежнее" Желающие убедиться в том, что родное, к сожалению, не всегда надежнее, могут выполнить следующие строки в 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.07.2005, 05:40:36 |
|
||
|
Строковые функции Transact-SQL <-> VFP
|
|||
|---|---|---|---|
|
#18+
Игорь совершенно прав: иногда VFP (точнее FP) функций очень не хватает в T-SQL. Я имею в виду именно простейших, скалярных функций, к которым так привык при написании клиента в VFP. Тем более, функций в T-SQL немного и они не всегда также работают, как аналогичные функции в VFP (например, VAL()). Собственно, в T-SQL UDF и ввели с целью расширенья языка. Полагаю, что любой разработчик кода на T-SQL начинает с того, что расширяет его с помощью UDF. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2005, 09:35:41 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33076509&tid=1593883]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 359ms |

| 0 / 0 |
