Разделы
Публикации
Популярные
Новые
Главная » Оптимизация производительности transact

1 2 3 4 5 6 7 8 ... 55

Char против Varchar

Выбор межхту полями переменной или постоянной длины зависит от ваших потребностей. Если паши данные сравнительно одинаковой длины и мапо изменяются от записи к записи, наиболее разумно использовать символьные поля постоянно/! длины. К^окдое символьное поле переменной длины ведет к допол-нитель!1!>1.\1 расхода.м, связанны.м с хранением длины поля в дополнение к данным. Если длина хранимых данных не сильно изменяется, си.мвольные поля постоянной д.Н!ны не только будут эффективнее храниться, но и дост>т1 к ни.м будет-осуществляться быстрее. Между тем, если длина данных значительно варьируется от записи к записи, предиочтц-гельпее !!спользовать поля переменной длины. Символьные !!оля переменной длины могут также быть эффективнее с точки зрения синтаксиса SQL. Рассмотри.м предыдущий при.мер: SELECT @\/ocalist+ sang the classic +(aSong+ for the band Free

Так как (©Vocalist - переменная с постоянной длиной, конкатенация работает не так, как мы могли бы ожидать. В отличие от поля с переменной длиной - (SSong, @Vocalist дополняется справа иробела.ми до его .макси.мальной длины, так что мы получаем следующий результат:

Paul Rodgers sang the classic All Right Now for the band Free

Конечно, можно использовать функцию RTRIM() для удаления этих дополнительных пробелов, !10 на.много эффективнее с са.мого начала объявить переменную (©Vocalist как varchar.

При такой конкатенации varchar необходимо по.мнить о смещении символов. В результате конкатенации двух строк типа varchar .может получиться третья строка, в которой ключевой символ (например, последний или первый си.\!вол второй строки) 01сазывается сдвипуты.м в новой строке из-за обрезания пробелов. Вот пример:

SELECT au fname+ +au lname FROM authors

(результаты сокращены)

Abraham Bennet Reginald Blotchet-Hal 1 s Cheryl Canson Michel DeFnance Innes del Castillo Ann Dull Marjorie Green Mormngstar Greene Burt Gringlesby

Из-за смещения символов и так как по крайней мере одно имя содержит несколько пробелов не существует г!ростого способа извлечь имена и фамилии авторов, после того как они были объединены таким способом. Поскольку поле au fname состоит из двадцати символов, первый символ aujname - это логический символ 21 в результирующем имени. Однако этот символ сместился из-за конкатенации aujname со строкой типа varchar (не дополненной пробелами). В результате позиция этого символа отличается для каждого автора, так что



12 10 11 15 cl

Так как ANSI PADDING была отключена, второй запрос не вернул ни одной записи, даже несмотря на то, что мы искали значение, которое только что добавили. Поскольку ANSI PADDING была отключена, когда добавлялось значение @johnbonham, конечные пробелы этой переменной были уда^тены. Вот почему длины приведенных данных различаются от записи к записи, хотя значения, которые мы добавляли, были одинаковой длины. Когда второй запрос пытается найти запись, используя одно из только что добавленных значений, е.му это не

Б дальнейшелг выделить первоначальи1>1е имена авторов будет н(М!().чможно. Вполне вероятно, это именно тот результат, которьн! вам нужен, но вы должны об этом помнить.

SET ANSI PADDING

По у.молчанию SQL Server не обрезает конечные пробелы п нули из значении типа varchar или varbinary, когда они добавляются в таблицу. Это происходит в cooTBCTCTBJHi со стандарто.м ANSI SQL-92. Если вы хотите пз.меншъ это поведение, используйте SET ANSI PADDING (или SET ANSI DEFAULTS). Когда ANSI PADDING имеет значение OFF, значения полей при добавлении в таблгиту обрезаются. В результате можно получить некоторые коварные пробле.чнзГ Вот при.мер:

SET NOCOUNT ON

CREATE TABLE #testpad (cl charOO)) SET ANSI PADDING OFF

DECLARE (arobertplant char(20).

lajimmypage char(20),

(ajohnbonham char(20).

(BjohnpaulJones char(20) SET (arobertp1ant= ROBERT PLANT SET (ajimmypage= JIMMY PAGE SET (ajohnbonham= JOHN BONHAM SET (ajohnpauljones= JOHN PAUL JONES

INSERT #testpad VALUES (grobertplant)

INSERT ftestpad VALUES ((ajimmypage)

INSERT #testpad VALUES ((ajohnbonham)

INSERT #testpad VALUES ((Bjohnpaul jones)

SELECT DATALENGTH(cl) as LENGTH

FROM #testpad

SELECT *

FROM #testpad

WHERE cl LIKE (ajohnbonham

DROP TABLE #testpao LENGTH



15 15 15 15 cl

JOHN BONHAM

Функции для работы со строками

в SQL Server существует лпюжество функций для работы со строками. Подробности вы можете найти в Books Online. Я покажу ва.м несколько са.мых интересных из них.

CHARINDEXO

Функция CHARINDEXO возвращает позицию од1юй строки внутри другой. Вот пример;

SELEC1 CHAR INDEX С Now.(aSong)

Опционатьно .можно указать нозицию, с KOTopoii будет выполняться поиск, подобно .это.му;

SELECT CHARINDEXCh. They call me the hunter.17)

SOUNDEXO

Функция SOUNDEXO возвращает строковое представление значения сгьмвольной строки. Как и в большинстве ана;югичиых решений, строка, возвращаемая функцией SOUNDEXO Transact-SQL, состоит из одного символа и трех цифр. SOUNDEX() чаще всего служит для решения проблем, связанных с орфографически.ми ошибка.ми и ошибочиььм вводом данных в базе данных. Вот при.мер использования этой функции;

SELECT SOUNDEXCTerry). SOUNDEX(Terri)

Оба этих выражения вернут код, равньп! Т600. Реализацгш SOUNDEXO в Transact-SQL очень иеза.мысловата, и ее просто обмануть. Вот при.мер;

SELECT SOUNDEXCRodgers). SOUNDEXCRogers)

удается, так как значение, которое он нстто.тьзует, не было обрезано. Вывод из этого следующий; отключение ANSI PADDING влияет только на способ хранения значений - оно пе из.меняет способы обработки переменных и констант. Но, поскольку они часто при.меняются в операторах сравнения с сохраненны.\иг значения, воз.\южны неправильные результаты - и с копечиы.ми иробела.ми, и без них.

Вот откуда появляются эти коварные проблемьг Как говорится, дьявол кроется в мелочах. Вот как будет выглядеть результирующее .\и10жество с включенной ANSLPADDING;

LENGTH



Вы можете подумать, что эти две фамилии будут иметь одинаковые soundex-коды, но на са\гом деле это не так. Обычно SOUNDEX() применяется для реалигза-ции несложного нечеткого поиска, для создания .\Н1е.моннческих ключей или кодов, и тому подобное. Из-за этих ограниченгн'г она редко встречается в реальных приложениях. -

Улучшенная функция SOUNDEX()

Достаточно легко написать процедуру определения фонетического соответствия, лучше предоставляемой SQL Server. Функция SOUNDEX() Transact-SQL основана на оригинально.м а^тгоритме, запатентованном Margaret ODell и Robert Russell в 1918. Для начала сделаем из этой функции хрантьмую процедуру. Вот храни.мая процедура, основанная на алгоритме ODell-Russell:

USE master go

IF OEJECT IDCsp soundex) IS ЮГ NULL

DROP PROC sp soundex

CREATE PROCEDURE sp sounde/ ginstnng varc.har(5C), Psoundex varcndr(50)--NJLL OUTPUT /*

Обьект: sp soundex

Описание: Возвращает soundex-Koa строки

Использование: sp soundex (ainsLгing=пpeoбpaзyeнaя строка, @souTidex ОиТРОТ-строка, в

которую будет возвращен soundex-KOfl Возвращает: (Ничего)

Создатель: Ken Henderson. Email: kheniakhen.CQm Версия: 7.0

Пример: sp soundex Rodgers

Создана: 1998-05-15. Дата последней коЕификаиии- 1998-05-16.

Примечания: Основана на алгоритме soundex, опубликованном Rcoert Russell и Margaret

ODell в 1918, Реализована на Transact-SOL - Ken Henderson. */ AS

IF ((air.string=/?) GOTO Help DECLARE ©workstr varchar(lO) SET iainstring=UPPER((ainstring)

SET (ascundex=RIGHT((ainstring.LEN((iinstnng)-1) -- Поместить все за --исключением первого символа в рабочий буфер (мы всетда возвращаем первый символ) SET (aworkstr=AEHIOUiJf - Удаляем эти символы из строки WHILE (Pworkstro) BEGIN

SET @soundex=REPLACE(@soundex,LEFT((aworkstr.l).)

SET (?workstr=RIGHT((aworkstr.LEN(iaworkstr)-l)

END /*

Преобразуем символы в числа, используя следующую таблицу:

Символ Число

B.F.P.V 1

C.G.J.K.O.S.X.Z 2

D.T 3

M,N 5

В SQL Server 2000 эти прп.мсры лучше оборачивать в функшш. - Пр1шеч. перев.



SET е лОГк5Гг ВЕРУ

WHILE (@wcrkstr<>-) BEGIN

SET (asoundex=REPLACE((asojPclex.LEFT;@worksLr.l;, Г J

SET (?workstr=RIGHT({3wCrk5tr.LENC(?workstr)-I)

SET (awor/cstr-XGJKQSXZ WHILE (Pworkstro ) BEGIN

SET ?sounaex=REPLACEC(asounaex.LtETC?workstrl). 2)

SET !aworkStr=R;GHT((awork5tr.LENCi3workstr;-l)

SET РлОгк$1г :Л

WHILE (laworkstro ) BEGIN

SET @soundex=REPLACE((asoLirdex.LEFr((awot-ks,r.I), 3)

SET (aworkstr=RlGHT((aworkstr.LENC(?workst-)-1;

SET ?soundex=REPLACEC@soundex. f /й')

SFF (pworkstr=MN

WHILE ((aworKStroo-J BEGIN

SET (asoundex=REPLACEC@soundex. LEFTCPworkstr. Ь , 5)

SET (aworkStr=RIGHTC@workstr.LEN(Pworkstr)-i)

SE (asoundex=REPLACEC?scundex. R. 6)

-- lenepb заменяем одной цифрой повторяющиеся цифры (например. И' или 22) DECLARE (?с int SV (ас=1

WHILE (iac<!0) BEGIN

SET (ascundex=REPLACE(@soundex.C0NVERT(char(2),(ac*Ii;.C0NVERT(char(l),(ac)} -- Умножаем на 11 для создания повторяющихся цифр SET (ас=@с+1

SE1 @soundex=REPLACE((asoundex.СО.С ) - Избавляемся or дзойпь.х нулей SEf (asoundex LEFT(@soundex.3)

WHILE (LEN(?soundex)<3) SET @soundex=(asoundex+0 -- Дополняем нулем

SET (asoundex=LEFT(@instnng. l)+(asoundex -- Добавпем в начало пераьж символ и возвращаем С

RETURN О

Help:

EXEC sp usage @oDjectna4)e=5p soundex, (desc-Возвращает soundex-код сгроки, @parameten5=@instring=npeo0pa3yeMafi строка. @50undex ОиТРиТ=строка. в которую будет

возвращен 5oundex-Ko,4. (aauthor=Ken l-endenson. (aemaibkheniatiien.com. (adatecreated=19980515. (aaatelastchanged-19980516, (aversion ?. @revision=0. (aexample=sp sounaex Rodgers RETURN -1

Создайте эту процедуру, затем протестируйте вашу новую процедуру, используя код, подобный следующему:

DECLARE (amysx varchar(4)

EXEC Sp soundex Rogers,(amysx OUTPUT

SELECT (Smysx. SOUNDEXC Rogers)



Ваша новая процедура и встроенная функция SOUNDEX() должны вернут одинаковый код.

Давайте теперь немного улучшим первоначальную процедуру путем оптимк зании оригинального алгоритма, представленного Russell. Вместо того чтоб] просто удалить буквы А, Е, Н, I, О, U, W и Y, заменим их девятками, затем уда лим из строки повторяющиеся цифры и удалим оставшиеся девятки. В резуль тате удаления девяток после того, как мы удалили повторяющиеся цифры, снов возникает возможность появления в строке повторяющихся цифр, для боле тонкой детализации. Данная процедура будет лучше работать с большим количе ством строк, чем первоначальная процедура. Вот пересмотренная процедура:

USE master go

IF OBJECT ID(sp soundex russeir) IS NOT NULL DROP PROC sp soundex russell

CREATE PROCEDURE sp soundex russel i (ainstring varchar(50). (Psoundex varchar(50)

=NULL OUTPUT

Обьект: sp soundex russell

Описание: Возвращает soundex-код строки (оптимизация Russella)

Использование: sp soundex russel 1 (ainstring=cTpoKa дпя преобразования. (Psoundex

OUTPUT-cтрока. в которую вернуть soundex-код Возвращает: (Ничего)

Разработана: Ken Henderson. Email: khengkhen.com Версия: 7.0

Пример: sp soundex russell Rodgers

Создана: 1998-05-15. Дата поспедней модификации: 1998-05-16. Примечания:

Основана на алгоритме, опубликованном Robert Russell и Margaret ODell в 1918. расширена с применением оптимизации Russell для большей детализации. */ AS

IF ((ainstring=/?) GOTO Help DECLARE (aworkstr varchar(lC) SET (ainstring=UPPER((ainstring)

SET (asoundex-RIGHT((ainstring.LEN((ainstring)-l) -- Поместить все. кроме первого символа, в рабочий буфер (первый символ всегда возвращается)

Преобразуем символь! к числач в соответствии со следующей таблицей:

Символ Число

B.F.P.V 1

C.G.J.K.O.S.X.Z 2

D.T 3

M.N 5

A.E.H.I.O.U.W.Y 9

SET (aworkstr=BFPV

WHILE ((Bworkstro ) BEGIN

SET @soundex=REPLACE((asojndex. LEFT(3workstr.D.T)

SET (aworkstr=RIGHT((aworkstr.LEN(@workstr)-l)



S£ (awcrksirCGJtVjSAi

WHILE {(pworkstro ) BEGIN

SET @soundex=REPLACE(;ascr.ce/ LLr ;3.-.ur>.,r. i),г'} SET @workstr=RIGrT(3work5tr,: H.h.orKslr)-I)

SET gwcrkstr=D

WHILE {(avvOr<str<>- ) ELGIN

SET (asobncle/=REPLACECC=bOjnc;p/.4FrT:bi,cr-kstr,;,. 3-;

SET (aworkStr=RIGHr((awarks:r,LiN:;awcr<SL) ij

SET Cosounde/=repdce(Ssojr,cie.<. 4. .i,

SET Caworkstr=MN

WHILE (iSworkstro ) BEGIN

SET (asoundex-REPLACE(?soupde/,l FFi(T3v(0-ksL>-.:;, 5 j SET @workS t r=R IGHT ((Pwork SI г. LEN; (p 0rk5L r) -1)

set @soundex=repldce(C 5cui:de;<. R. б';

SET @workstr=AEHIOUwy WHILE {(aworkstfo ) BEGIN

SET @sojndex=REPLACE{(asouridex, LET i (3wGrksir,!). J;

SET @workstr=RIGHT{(awor cstr.LEN(? ork5tr)-i)

-- Теперь заиеняем повтоояющиеся сичзслэ: d-anpuMep. li или 22)

одиночными

DECLARE @с irt SET @c-l

WHILE ((ac<10) BEGIN

-- Умножаем на И для создания пов-оряощихся цлфр

SET (ascundex=REPLACE(!asoundex,C0NVERT(chdr;2; .@c*il;.CCNVERT(char(]) @c)) SET @c=@c+I

SET @soundex=REPLACE{(asoundex.ОС ,C ) -- Избазлясяся о- .улей SET @soundex=REPLACE{@sounde/.9. ) -- Избавляс-мся о; дс-аятон SET @soundex-LEFT(!3soundex,3;

WHILE (LEN(@soundex)<3) SET (PbUL.rGex=i3soL;r,Ge.-* 0 -- Дополняем нулями

SET @soundex=LEFT(?instring,l)-ra.cL.ndfcx -- Добаз.яем з начало лервь.й симвсп и возвращаем О

RETURN О

Help:

EXEC sp usage @objectname-spjouncex rL.ssell, &de5c-Returns the soundex of a string

(Russel1 optimization). @parameters=@instring=string to transiate, lasoundex OUTPUT=string in which to return soundex.

@author-Ken Henderson. @emai >knen(akhen.com. @datecreated=19980515, (adatelastchanged=1998C516, @version=7, @revision=0. @example-sp soundex russei1 Rocgers RETURN -1

3 Зак 70



Как и у первоначальной процедуры, лнюжество возможных возвращаемы кодов 3Toii процедуры довольно огранпче11НО - 26 возможных нач;ыьных бук. сопровождаемых тремя цифрами, что составляет 26 х 103, или 26 ООО возмоя ных soundex-кодов. Если мы заменим три последние цифры на буквы, то знач1 тельно увеличим число возможных кодов - до 264 или 456 976. Вот процедур; использующая этот подход:

USE master GO

IF OBJECT ID(sp sounclex alp.ha) IS NOT NULL DRO.P PROC sp sounclex alpha

CREATE PROCEDURE sp sounde/ aDha Cainstring varc.har(5C;, gsouncex varcnar!50)=NULL

OUTPUT

Обьект- sp soundex alphd

Списание; Возврашает souncex-Koi; строки

Использование: sp soundex alpha @1nstnng=CTpoKa для преобразования. Ssoundex

ОитриТ=строка. в которую верну-!ь soundex-KCfl Возвращает: (Ничего)

Автор: Ken Henderson. Email: khen(aknen.com Версия: 7.0

Прииер: sp 5oundex alpha Rodgers

Дата создания: 1998-05-15. Последние изменения: 1998-05-16.

Примечание: Превоначальный источник неизвестен.

Реализована на Transact-SQL -Ken Henderson.

II ((ainstmng-/?) GOTO Help DECLARE (aworkstr varchardo) SET (ainstring=UPPER((ainstring)

SET (asoundexRIGHT((ainstring.LEN(@1nstring)-l) -- Поместить все симвогь; креме первого

в рабочий буфер (мы всегда возвращаем первый символ) SET (aworkstr=EIOUY - Заменить гласные наА WHILE ((aworkstro ) BEGIN

SET (asoundex=RE?LACE((asoundex.LEFT((aworkstr.l), A)

SET (aworkstr=RIGHT((aworkstr.LEN(Caworkstr)-l)

END /*

Преобразуем префиксы слов, используя эту таблицу

From То

MAC МСС

KN NN

К С

PF FF

SCH SSS

РН FF

-- Присоединим первый символ

SET Casoundex=LEFT(cainstringЛ)+(asoundex

IF (LEFT((asoundex.3) = MAC) SET (asoundex=MCCRIGHT((asounaex,LEN((asoLlnclex)

IF (LEFT((asoundex.2) = KN) SET (asoundex=NNRIGHT((asoundex.LEN((asoundex)-2) IF (LEFT((a5oundex.l) = K) SET (asoundex=CRIGHT((asouпdex.LEN((asoundex)-l) IF (LEFT((asoundex.2) = PF) SET (asoundex=FF+RIGHT((asoundex,LEN((asoundex)-2) IF (LEFT((asoundex.3)=SCH) SET @50uпdex=SSSRIGHT((asoundex.LEN((asouпdex)-3)



IF (LbFC?iOJi.cle,<.2 = Fli) SEi escuncex-Fr RIGrlKgsoundex.LENiC-soundex;-?: -- Уяэп/к порва;й си.нзолЗЕ Яnstr:r:g=?suu,jex SET Psoundex=RIGHT;?sOunGex.LEN(?souncex; -1) /*

Преобразуем йонет/.ческие префиксы (сгедуюулб за пеовым символом) с гюмощью этой габл1

From Тс

DG jG

caan ТА/ аК

О Т

NST NSS

av af

Q G

Z S

М К

КН №.

К С

н А (..nless pa-t of aha;

AW a ph ff SCH SSS */

SET (3sounGex=REPLACE(@sounaex. DG. GG) SET (asouPdex=REPLACE((asoundex, CAAN, TAAN) SET iasoundex REPLACE((asoundex. D, T) SET (asour,dex=REPLACE((asojndex. NST. NSS; SET (asoundex-REPLAC£((asoundex. av . AF) SET iasoundex=REPLACE{!asoundex. Q. G) SET gsoLindex-REPLACE((asoundex, Z. S} SET (asoundex=REPLACE((asoundex. M. N) SET (ascundex=REPLACE((asouridex. KN. NN) SET (asGundex-REPLACE{(asoundex. k. c)

-- Преобразуем h к a, если только она не является час1ью АНА

SE (asoundex-REPLACE((asoundex, aha. -)

SET (a50undex=REPLACE{(asounaex. н'. a)

SET (asoundex-REPLACE((asoundex. -. AHA)

SET (asoupdex=REPLACE(@scundex. aw , a)

SET (asoundex=REPLACE((asoundex. PH, ff)

SET (asoundex=REPLACE((asoundex. SCH, SSS)

-- Удалим конечнуо a или S

IF {RIGHT((a50undex.l) = a or RIGHT{(asoundex, 1)-S) SEr @soundex=LEFT((asoundex. LEN{?soundex) -1) -- Преобразуем конечные символы NT к ТТ

IF (RIGHT((asoundex,2)-NT) SET (asoundex-lef;((asoundex,LEN(&soundex)-2) iтТ -- Удаляем все a

SET iasoundex=REPLACE(!asoundex. a, )

- - Вернем превый символ

SET (asoundex=LEFT(@i nstr1 ng. i )+(asoundex

-- Удалим повторяющиеся символы

DECLARE (ас int

SET (ac-65

WHILE ((ac<91) BEGIN

WHILE (CHARINDEX(char((ac)+CHAR((ac).t soundex)<>0)

SET (asoundex=REPLACE((asoundex,CHARtiacXHAR(gc).CHARCgc)) SET gc-iac-l

SET (asoundex=LEFT((asoundex.4)



IF (LrN((asobndex)<i,. SEI (asoL,ncexPsou!;c!CA-rSPACE(4-LE\;[osour,Ge/.;) -- Рас wit.r. spaces

RtTURN С

Help:

EXEC sp uscge C°objectname=sp sounciex clpha, ?desc=ReT,urns the sour.aex of a string, @paranieters=@instring-stnng to translate. Psoundex CUTPiJT=string m which to return soundex,

(aauthorKen Henderson, @emai 1 = кпегЗкТ.ег.com, @datecreatea=19980515 . C=catelastchanged=19980516, (aversion-/. (arevision=0, (aexample=sp soundex alDha Rodgers RETURN -I

Чтобы упидеть преимущества 3Toii процедуры no сравнению с лругн.ми, бгзлее нримитнвны.\н1, реалнзацня.мн, вьтолните следующий запрос:

DECLARE (amysxl varchar(4). (amys/2 varchar(4)

EXEC sp soundex alpha Scnuler.ipmysxl OUTPUT

EXEC sp soundex alpha Shuller.tamysx2 OUTPUT

SELECT (amysxl.(amysx2.SOUNDEX( Schuller ),SOUNDtX( Snuller)

Благодаря тому, что эта процедура превосходно обрабатывает такие общие фонетические эквиваленты, как SCH и SH , sp soundex alpha корректно возвращает одинаковый soundex-код для Schuller и Shuller, тогда как SOUNDEX() возвращает разные коды для каждого из этих написаиип. По.мимо очевидного использования для идентификацтш разных написаний одинаковых имен, главная причина, по которой на.м необходима более сложная процедура, такая как sp soundex alpha, - потребность в большем количестве кодов, а никак не меньшем. Рассмотрим следующий тестовый сценарий:

DECLARE (amysxl varchar(4). (amysx2 varcnar(4>

EXEC sp soundex alpha Poknime. (Pmysxl OUTPUT

EXEC sp soundex alpha Pokmmoister,(amysx2 OUTPUT

SELECT (Smysxl .(amysx2.soundex( Poknime) ,soundex( Pokmmeister)

В этом сценарии sp soundex alpha корректно ра,зличает два имени, тогда как SOUNDEXO не может этого сделать. Почему? Потому что sp soundex alpha уменьшает комбинащно KN до N , получая так1ьм образо.м возможность обработать S>> в конце Poknimeister. SOUNDEX() же не настолько совершенна. Поскольку она оставляет сочетание КХ неизменным, мы получаем результирующую строку для обоих - PKNM, таким образом, для обоих и.мен .мы получаем одшгаковый soundex-код.

DIFFERENCEO

В дополнение к SOUNDEX(), DIFFERENCEO возвращает числовое значение, обозначающее разницу между значениями soundex для двух символьных строк. Возвра-нтаемое значение варьируется от О до 4, 4 означает, что строки идентичны. Итак, используя предыдущий пример,

SELECT DIFFERENCE(Terry. Terri) возвращает 4, тогда как

SELECT D!I-FERENCE(Rodgers. Rogers) возвращает 3.

Также просто можно создать хранн.мую процедуру, возвращающую разницу между двумя soundex-кодами:



1 2 3 4 5 6 7 8 ... 55
© 2004-2024 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки.
Яндекс.Метрика