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

1 ... 29 30 31 32 33 34 35 ... 55

i?L;dei e:.er-S¥pd-c;-fc:o-S

!acuthor=(?ai,iror. йена 1 =?е[па i 1.

yvesion=Overbcr. Cnx-v ii r,-ii;i evison. ?C3tec-cate(!=@aaiccredt.oc. ScatsasicrdnyrC-i-Juieasl;:>-: ,cec ?RIK CHAK43J-V

R[:uKN С he;p:

EXEC sp -.sd(je ?otjectr,ai;ie=SD cojeci scnpt cy;r;entt.

bdesc=Генер/рует заголоБк/1-кс1.ме тарии для ЗОЕ-сиенар/.ев. ?paraneters=i5objectn3;iie= 0cjectNai!;e . ?de5c= Descr-,ctior. cf object .gpa-ar,eters* oardnl[ .pa-an2...] .

@exa[T;p:e=so object scr;ot comir!er!ts ?cojectr;ap:e* 5p vvr,o . i?aesc= Bu3Bpoitae! список зада , выполня.сщихся в насюяц^й .чсченг . ?pu,-u!neters-L! loginnaiTie]. @author=Ken Her.derscn. Pemai = khen(j<heR.coiii. @vers:on=3. revision-; .

eoetecreated-19920403. (bdateUstcrar.std- :999G/u; RETURN -1

Эта процедура генерирует заголопки-ко.чьмеитарни для .храни.мых процедур, используя процедуру sp usage. которую .мы рассмотрим позже в yroii главе. Данная процедура может быть выполнена 1гз любо11 базы данных любой процедурой.

Разрешите вы.зов процедуры со снравочиы.м иара.метро.м тина /? или без параметров, чтобы вернуть инфор.мационное еообшеиие, указывающее вызывающей нрогра.мме, как использовать нроцедуру. Разместите часть, i-енерн-рующую эту справочную инфор.мацпю, в конце процедуры, чтобы она не .Mcniiuia и чтобы ее .местонахождение было постоянным для любо11 процеду-рьг Идеальны!! способ сделать это - создать i! вь!3вать отдель!!у!0 !!роцсду-ру, которая пр!!!!1!.\1ает пара.\!етр!л, показыва!0!!и!е и!!формац1!!о об ис!1ользо-ва1И!и, !! возвращает ее в ед!1!!0образиом фор.У!ате. Вот cne!!ap!!ii, который создает 1!роцедуру sp usage, которая 1!езде в ки!1ге !1р1!.\!С!!яется для 3roii цел!!:

USE iTdster GO

IF 0B,lEC 10CGbc.5p u5age) IS N01 NULL DROP PROC Gbo.sp usage

CREATE PROCEDURE dbo.sp usage -- НесСхсдимые пдоа.чегрь' CDjectnanie sysname=NULL. edesc sysr,a[ne=NULL. -- Опциональные пара,че:ры parameters varchar(8Q00)=NULL. [returns varchar(8000)= (None). ipexample varcnar(80C0)=NULL. (?autnor sysname=NULL. Ponai1 sysname=(none), @versicn sysname=NULL. (prevision sysname=0.



@datecreated sma11datetime=NULL. @datelastchanged smalldatetime=NULL

Объект: sp usage

Описание: Возвращает информацию об использовании хранимых процедур и описания других типов объектов

Использование: sp usage (aobjectname= ObjectName . @desc= OnHcaHHe объекта [. (aparameters= paraml,param2... ] [. (аехатр1е= Прикер использования ] [, (3author- ABTop объекта ] [. (aemail= eman автора ]

[. (aversion Номер версии или другая информация ] [. @revision= HoMep ревизии или другая информация ] [. (adatecreated= flaTa создания ] [. 9date1astchanged= BaTa последней модификации ] Возвращает: (Ничего)

Разработана: Ken Henderson. Email: khen@khen.com Версия: 3.1

Пример: sp iisage ?objectname= sp who . №sc= Boз8paщaeт список задач, выполняющихся 8 настоящий момент . ?parameters=[?loginname]

Создана: 1992-04-03. Дата последней модификации: 1999-07-01.

*/ AS

SET NOCOUNT ON

IF (@objectname-b№sc IS NULL) GOTO Help PRINT Объект: +@objectname PRINT Описание: +Mesc

IF (OBJECTPROPERTY(OBJECTJD(?objectname). IsPnocedune )-l) OR (0BJECTPR0PERTY(0BJECT 10(?objectname).IsExtendedPnoC)=1) OR (OBJECTPROPERTY(OBJECT ID(?objectname).IsReplProC)=1)

OR (L0WER(LEFT((aobjectname.3))=sp ) BEGIN -- Специальная обработка для системных хранимых процедур

PRINT СНАР(13)+Использо8ание: +(aobjectname+ *?parameters PRINT СНАР(13)+Воз8ращает: -bgretums END

IF (gauthor IS NOT NULL)

PRINT СНАР(13)+Разработана: -ь?аигЬог-ь'. Email: -b-?email IF (Aversion IS NOT NULL)

PRINT СНАР(13)-ь'Версия: +?veгsion-.+?revislon IF (example IS NOT NULL)

PRINT СНАР(13)+Пример: +@example IF (gdatecreated IS NOT NULL) BEGIN - Обрезать время, если это полночь

DECLARE gdatefmt varchar(8000). (Jdc varcharOO). Ic v3rchar(30)

SET @dc-CONVERT(varchar(30). (adatecreated. 120)

SET @lc<ONVERT(varchar(30), ?datelastchanged. 120)

PRINT CHAR(13)*C03flaHa: +CASE DATEDIEF(ss,C0NVERT(char(8).(adatecreated,108).00:00:00) WHEN 0 THEN LEFT(Pdc.iO) ELSE ?dc END

+ . Дата последней модификации: -ьСАЗЕ

DATEDIFF(ss,CONVERT(char(B).№telastchanged,108),00:00:00) WHEN О THEN

LEFT(?lc.l0) ELSE @lc ENO-.

RETURN 0



heip:

EXiC 5p bScge C=oDjectnn:pe=sp usage. - Еекурс/Бпг.й вызов

&desc=Возвращав' иьформаиию об /сполизовании хранимых процедур и оп/санк-я дру'ч/ типов обьектов.

{aparameters=@oojecinaTie ODjectName , Ме5С= 0писапие объекта [. gD3rametefs= par3iri! ,рзг-ат2... ] [. (Зехал1р'1е= Лримео использования J L, LaautlMrHBrop объекта J [. {aemail= email автора ]

[. ipvers;on= HoMep версил /ли другая инфсрнация ]

[. @revision HoMeD ревизии или другая информация ]

[. (абагесгеаТеб= Дага создания ]

[. ?aatelastchanged= flaTa последней модификации ]. (?oxample=so usage @objectname- spjAho , (pc:esc= Bo3Bpaii,aeT список зада-, выполняющихся в настоящий момент , (?parameters=[i?logirname]. ?author=Ker! Henderson. ?email = khenia<hen.com, ?version=3. l2revision=r . ?datecreated=4/3/92, gaate3stchanged=7/l/99 RETLR.M -1

Передав соответствующие пара.метры, вы можете при.менить sp usage, чтобы вывести информацию об использовании любой процедуры. Sp usage вызывает сама себя для той же са.мой цели (именно поэтому мы получае.м предупреждение: Ошибка добавления записей к sysdepends для данной хранимой процедуры, отсутствует объект sp usage . Хранимая процедура несмотря на это будет создана). Поскольку Transact-SQL не поддерживает пoдпpoгpa.м.vшl, sp usage использует переход с по.мошью ко.\шнды GOTO, чтобы разместить справочное сообщение в конце процедуры. Этот подход позволяет коду в начале процедуры провести проверку правильности параметров и при необходимости перейти к выводу информации о том, как пользоваться процедурой.

О Устанавливайте любые пара.метры окружения (QUOTEDJDENTIFIER, ANSL DEFAULTS и так далее) в начале процедуры, так как они .могут существенно повлиять на процедуру. Пусть у вас войдет в привычку устанавливать их в са.мо.м начале процедуры, чтобы они были понятны другим разработчикам.

о Избегайте ситуаций, в которых владельцы хранимой процедуры и использующихся в пей таблиц различаются. Лучший способ сделать это - указывать в качестве владельца всех создавае.чнях ва.мн объектов пользователя dbo. Наличие множества объектов с одинаковыми названиями, но раз?1ыми владельца-.ми приводит к путапице в базе данных. Если есть воз.можность, этого следует избегать иа корноратив1Ш1х серверах еще в процессе разработки. Разрешайте пользователя.м, отлпчны.м от dbo, владеть объектами, только когда это действительно необходимо.

О Используйте префикс sp только для систехитых процедур, находятщьхся в базе дан?1ых master. Не со.здавайте процедуры с префиксом sp в пользовательских базах данных и несистемные процедуры в базе данных master.

о Для процедур, которые должны быть созданы в ко}1кретной базе данных (напри.мер, системные процедуры), включайте в иачгъто сценария создания процедуры К0ЛКП1ДУ USE dbname, где dbname - и.мя требуемой базы данных. Это гарантирует, что процедура окажется там, где ва.м необходи.мо, и избавит вас .



от необходимости помнить о смене теку1пей базы данных перед ньшолнени-ем сценария.

О Создавайте хранимые процедуры настолько простыми и модульны.ми, насколько это возможно. Каждая хранимая процедура должна выполнять единственную задачу или пебольп1ую группу тесно связанных задач.

О Применяйте SET NOCOUNT ON, чтобы минимизировать сетевой трафик при использовании хранимых процедур. Как правило, это должен быть первый оператор в каждой хранимой процедуре, которую вы создаете. (Учтите, что NOCOUNT ON может вызывать проблемы с некоторыми приложениями - например, с отдельными версиями Micro.soft Access.)

О Создавайте хранимые процедуры с опцией WITH ENCRYPTION, если хотите скрыть исходный код процедуры от пользователей. Не удаляйте исходный код из syscomments - в результат-е вы не сможете выполнять процедуру и придется удалить ее и со.здать снова.

Временные процедуры

Временные процедуры создаются так же, как и времетиле таблицы - если при создании указать префикс #, будет создана лока.>1Ьпая временная процедура, которая видна только текущему соедннитю, а если указать пре(}зикс ##, будет создана глобальная временная процедура, которая видима всем соединениям.

Системные процедуры

Системные процедуры находятся в базе данных master и имеют префикс sp . Вы можете выполнять систе.м?[ые хранимые процедуры из любой базы да}1ных, при этом системная процедура выполняется в контексте текущей базы данных. Так, например, если процедура ссылается на таблицу sysobjects (существующую в каждой базе данных), она получит доступ к таблице sysobjects в базе данных, которая была текущей в мо.мент запуска процедуры, а не к таблице из базы данных master. Вот при.мер простой хранимой систе.мной процедуры: USE master

IF OBJECT lDCdbo.sp createa-) IS NOT NULL OROP PROC dbo.sp created

CREATE PROC dbo.sp created Pobjname sysname-NULL /*

Объект; sp created

Описание; Возврашает дату (даты) создания указанного (указанных) объекта (объектов) Использование: sp cre3ted (аоЬ,]пате Наз8ание обьек;а или маска для отображения

Возвращает: (Ничего)

Разработана: <еп Hende-son. Enaii: knen(ai;hen.com Версия: 1,0

Пример: sp cre3ted (aobjname= Tiyprocsr

Создана: 1999-08-01. Дата последней модификации: 1999-08-15.



!г (5oLjri<i,iie IS NUL;J or ($оь:г\а:к-.= V > GOlb hep

S:llCT name. cnPate cROM sysobjecti

WHERE name Hke (pobjnane

RElbRN 0

Help:

FXEC bp l.bdge (.3objectname=sp , ,ieatec,

?с1е5С'Бсзврашаст дату (даты) создания д.пя укозе-ihoro !у<азаннь1х; обьекта (сбье.ктов; ?parameters=@c.6jnaiTie= Ha33anne обьекта или маска для о1обра:<ения , (aexample=sp cneatecl Pobjnar,e-- iTiyDrocsJ . 03uthon .Ken Hende-son, @eiri3Tl = ,<hen?khen.con. gversTonГ , @геут51сг=-С',

@dalecneabed=199908G1. gdatelastchanceG-19990815 RETURN -1 USE puos

EXEC sp cneated lauthcnr

name crdale

authons 1998-11-13 03:10:48.470

C< authors au id 08EA5/93 1998-11-13 03.10:48.657 CK authons zip 0AD2AC05 1998-11-13 03:10:48.657 DE autnons phono 090E7BCC 1998-11-13 03:10:48.657 tifieauthon 1998-11-13 03.10:49.220

Эта процедура для объектов, и.мена которых совпадают с и1аблоном, выводит их названия и даты создания. Вот при.мер, в которо.м используется систе.мная храии.мая процедура са.мого SQL Server. Как и предыдущая процедура, оиа может быть запущена из любой базы данных для получения инфор.мации об этой базе данных;

USE pubs

EXEC sp spaceused

database name database size unallocated space

pubs 4.13 MB 2.30 MB

nesenved data index size unused

1864 KB 816 KB 696 KB 352 KB

Чтобы построить этот отчет, процедура sp spaceused использует информацию из нескольких системных таблиц SQL Server. Поскольку это системная хранимая процедура, оиа выполняется в контексте текущей базы данных, несмотря на то что находится в базе данных master. Обратите вии.мание, что независи.мо от текущей базы данных вы .можете выполнить системную хранимую процедуру в контексте заданной базы данных, добавив название базы данных к имени про-цедургл (как если бы она находилась в этой базе данных). Вот npHiviep:

USE pubs

EXEC Northwind..sp spaceused

database name database size unallocated space Nortiiwina 23.88 MB 21.01 MB



reserved data index size unused

2936 KB 1240 KB 1336 KB 360 KB

Здесь процедура sp spaceused показывает ипфор.мацию об утилизации дискового пространства базы данных Northwind, хотя эта процедура находится в базе данных master, а текущая база данных - pubs. Это происходит потому, что мы указали ?ia3BaiHie базы дантях в имени хранимой процедуры. SQL Server корректно определяет, что процедура sp spaceused находится в базе данных master и выполняет ее в контексте бааы дан1Н11х Northwind.

Созданные пользователем систе.миые процедуры отображаются а Enterprise Manager как пользовательские объекты, а не как системные. Это происходит пото.му, что бит в столбце status таблицы sysobjects, указывающий на то, что процедура системная (ОхСООООООО), пе устанавливается по умолчанию. Чтобы установить этот бит, можно воспользоваться недоку.ментироващю!! системной хранимо!! процедурой sp MS marksystemobject. Ед1!!1ствс1!!н,!й !!ара.метр этой процедуры - название объекта, который вы хотите !10мет!!ть как системный. Мног!!е недокументированные функции и команл1>! DBCC работают !!еко1)рект!!0, если их в!)1зы-вать !ie из систем!1Ь!Х объектов (ло!!ОЛ!!нтел1>1!у!о нпформа!Ц!Ю вь! можете найт!! в главе 20, Недокументированн!)1Й Transact-SQL ). Для !!роверки, усга!!0!!ле!1 ли системный бит объекта, !C!ЮЛ!xyiтe С!юйство IslMSShipped (JjynKiuHi OBJECrPROPERTY().

Расширенные процедуры

Расширенные процедуры - это !!ро!гедур!.1, рас1!ола1-а!оип!еся в DLL !i фу!!КЦ!1о-нирующие так же, как и обычные !!ро!1Сдурь!. Oi!i! получают пара.метры и возвращают результаты, используя Open Data Services API SQL Server, i! обь!Ч!!0 пишутся на С или С++. Они долж!н>! находиться li базе да!И!Ь!х master !i вы!10л-няться в адресном 1!ространстве !!po!iecca SQL Server. Замст1>те, что их необязательно !1исать на С или С++, !io, есл!1 вы ре1!!ите писать !!х !!а другом языке, na.v! CHa4aj!a г!ридется выпол!1ить огро.мну!0 работу !!0 !!рсобра:ю!занню заголовоч!!!>!Х фа1мов ODS !ia этот язык. Я сам разрабат!>1!)ал расшире1!!1Ь!е хра!1!1.мь!е процедуры с помощью Delphi и нсскольк!!Х других Н!!Стру.ментов, так что это решаемая, но сложная задача.

Дру!юй С!10соб вызывать процедуры, на!И!са!1НЬ!е !ia языках, отл!1Ч!1ЫХ от С/ С++, заключается в созда!!Ии !!роцсдуры-оберткн с !!омо!цью ко\!Нилятора С++ и заголовков ODS и вызове ваших процеду)) (которые !!аходятся в дру!Т!х DLL) из !1их. Таким образо.м, В1я получите лучшее из обог!Х с!!особов -- вы создаете !!ро-цедуры на языке, который вам больше нравится, и ва.м !!е нуж!10 !!реобра-зовывать на другой язык огро.мнос кол!гчество Koi!CTaiiT, объявлег!И11 функций и тому иодобного.

Обратите вии.мание на то, что в отличие от SQL Server 6.5 и более ранних версий названия хранимых процедур не чувствительны к регистру. До версии 7.0 в вызовах раснтренных хранимых процедур необходн.мо было использовать тот же регистр, li которо.м они были объявлены в своих DLL, неза1!Исн.мо от установок чувствительности к регистру на сервере. Начиная с 1к;рсии 7.0, сервер найдет соответствующую процедуру пезавнсимо от использованного регистра. Вызовы раситренных хранимых процедур работают не так, как вызовы системных



процедур. Расширенные .храни.мые процедуры не ишутся автоматически в базе данных и не предполагают выполнение в контексте текущей базы да1Н1Ьгх. Чтобы выполнить храии.мую процедуру не из базы данных master, необходи,\ю полностью указать ее и.мя (напри.мер, EXEC master.dbo.xp cmdshell dir).

Существует способ обо!1ти это различие и сделать расширенные процедуры нехпюго более удобны\п1 - обернутЬ> раснгаренную хранимую процедуру в сис-тс.мпую. Это позволяет вьиюлнять ее 1гз любой базы данных, не указывая префикс niaster . Данный способ при.меняется для работы со многими расширенными храни.мы\п1 процедура.\нг SQL Server - многие недоку.ментированные расширенные процедуры обернуты в системные xpaini.Mbie процедуры. Вот пример использования такой обертки :

USE master

IF (OBJECT ID(c!bo.sp hexstring) IS NOT MULL) DROP PROC dbo.sp hexstring

CREATE PROC dbo.sp hexstr1ng Pint varcnardO-NULL, Shexstring varchar(30)=-NULL OUT /*

ООьект: sp hexstnng

Описание: Возвращает пег.ое значение s виде щестнад.атеричной строки

Использование: sp hexstrTng @1р1=иелое значение для преобразования, (anexsirmg-OUlPUT

выходной параметр, в который будет псмещена иестнадцатеричиая строка Возвращает: (Ничето)

Разработана: Ken Henderson, Email: khenPKhen.com Версия: 1,0

Пример: sp hexstring 23, Pmynex OUl

Создана: 1999-08-02, Дата последней модификаиии: 1999-08-15, AS

IF (@int IS NULL) OR ((Pint = /?) GOTO Help

DECLARE gi int. @vb varbinary(30)

SELECT iai=CAST((aint as int), @vb=CAST((ai as vanbinary)

EXEC master, ,xp varbintohexstr M. (Phexstring OUT

RETURN 0

Help:

EXEC sp usage (acbjectname=sp hexstr1ng,

(3desc=Воз вращает целое значение в виде лестмалцатеричной строки, l3parameters=@!nt L;eroe значение для преобразования, @hex5tring=0UTPUT выходной параметр, в который будет помещена шестнадцатеричная строка

gexample=sp hexstring 23 , @myhex OUT, (pauthor-Ken Hendenson, (aemail-l<heni3l<hen,com, Aversion-1, I3revision=0,

?datecreated=19990802, @datelastci-,anged19990815 RETURN -1

DECLARE lahex varchar(30)

EXEC sp liexstring 10, ghex OUT

SELECT eiiex

OxCOOOOOOA



Вся задача процедуры sp hexstring сводится к проверке параметров перед обращением к расширенной процедуре xp varbintohexstr. Поскольку sp hexstring - системная процедура, ее можно вызывать из любой базы данных, не вызывая напрямую процедуру xp varbintohexstr.

Внутренние процедуры

Множество системных храьн-1,мых процедур на самом деле не являются ни по-настояще.му системиы.ми, пи расширенными процедурами - они реализованы внутри SQL Server. Примерами таких процедур являются: sp executesql, sp prepare, большинство процедур sp cursorXXXX, sp reset connection и так далее. Эти процедуры имеют заглушки в master..sysobjects н отображаются как расширенные процедуры, но фактически реализованы внутри сервера, а не во внешних DLL. Вы не можете просмотреть их исходный код, поскольку он является частью самого сервера, а также вы не .можете проводить их трассировку отладчиком Transact-SQL, так как они не иаписап7л .на Transact-SQL.

Выполнение хранимых процедур

Хотя выполнить хранимую процедуру .можно просто написав ее имя в пакете команд, возьмите в привычку писать EXEC перед именем хранимой процедуры: sp who

Вызов хранимой процедуры без ключевого слова EXEC должен быть первы.м в пакете команд, поэтому если в дальнейшем перед вызовом процедуры добавятся какие-нибудь строки, ваш код перестанет работать.

Вы можете указать опцию WITH RECOMPILE при вызове хранимой процедуры (с EXEC или без), чтобы В7>1зывать пересоздание ее плана выполнения. Это удобно, когда вы знаете, что факторы, связанные с созданием плана вынолпення, достаточно из.менилмсь и пересоздание плана увеличит производительность. *

INSERT и EXEC

Команда INSERT поддерживает вызовы xpaHH.vHiix процедур для получения записей, вставляемых в таблгщу. Вот при.мер:

CREATE TABLE #locks (spid int. dbid int. cbjid int. objectname sysname NULL, indid int. type char(4). resource char(15). mode cnar(lO). status char(6)) INSERT flocks (spid. dbid. objid, indid. type, resource, mode, status) EXEC sp lock

Этот способ удобен для сохранения результатов храни.мой процедуры в таблицу для дальнейшего использования. До появления выходных параметров курсорного типа он был единственным для работы с наборами данных, возвращаемых хранимыми процедурами. Связку INSERT...EXEC также можно примегшть и при работе с расширенны.ми храни.мыми пронедура.ми. Вот простой пример:

CREATE TABLE #cmd result (output varchar(8000))

INSERT #cmd result

EXEC master,.xp cmdshell copy erroriog,l *,sav



Настройки окружения

Mtio>Kec;TBO настроек окружения SQL Server зачрагивакгг повеление хранимых процедур. Большинство 1Шсгроек определяются ко.\1а11да.\и1 SET. Они влияют на то. каки.у! образо,\1 храни.мые процедуры обрабатывают пустые значения, кавычки, курсоры, BLOB-иоля и так далее. Две ik них - QUOTEDJDENTIFIER и ANSI NULLS сохраняются непосредственно в столбце status таблицы sysobjects. То есть когда создается храии.мая процедура, значения этих двух настроек будут сохранены в.месте с иен. HacrpoiiKa QUOTED IDENTIFIER определяет, иптерпрети-ровать ;п! строки в дво11Ных кавычках как идентификаторы обьектов (}1апример, таблиц и.и1 столбцов). ANSI NULLS определяет, разрешены ли He-ANSI-сравнения с неопредсленны.\и1 значения.\п1. Вот при.мер, показываюши11 нспользоваиие идепти(})икаторов в кавычках с настройкой QUOTED IDENTIFIER:

USt pubs

SET CUOTED IDENTIFIER ON GG

IF CBJECT IDC TABLE) IS NOT NULL DROP PROC TABLE

CRE.ATE PROC TABLE Otaoleclduse va-chdr(80G0), iacciu,Tirclause varchar(800G) = *, g.vherec)au5e varc,har(8000)=NULL, ggrcupbyclause varcnarCSOOO-NULL, Phavingclause varchdr(8000)=NULL, (porderbyclause var-c,har(8000)=NULL, laccniDuteclause varcFar(8000)-NULl AS

DECLARE 3e-xecstr varchar(80G0)

SET (aexecstr-=SELECT +iacoluninclduse+ FROM i-gtableclause

-ISNULLC WHERE t-gwhereclause, )

+1SNULL( GROUP B/ +?g,-oupbyciause, )

+ ISNULL( HA\/ING +№avingclause, )

ISNULLC ORDER Bl laorderDyclause, )

+ISNULL( COMPUTE +(acG,!iputeclause, )

EXEC(Pexecstr)

SET OUOrED IDENTIFIER OFF GO

Благодаря SET QUOTED IDENTIFIER .мы може.м исио.чьзовать зарезервированное слово TABLE в качестве названия процедуры. Это позволяет создать свою собственную версию команды TABLE ANSI/ISO SQL, которая не реализована в Tran,sact-SQL. Поскольку процедура названа с при.менение.м зарезервироваи-пото слова, выполнение ее также требует SET QUOTEDJDENTIFIER:

SET 0UOTED IDENTIFIER ON GO

TABLE sales.titie id, SUMCqty) AS

sales,title id-;> PS2091 ,title id,DEFAULT,2 DESC

SEI OUCTED IDENTIFIER OFF GO



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

РС8888 50

BU1032 45

МС3021 40

TC3218 40

BU2075 35

Учтите, что я не рекомендую использовать зарезервированные слова в качестве идентификаторов объектов. Я считаю, что это только добавляет ненужный беспорядок в код. Однако я должен вас об этом предупредить, поскольку другие разработчики иногда так поступают.

SET QUOTEDJDENTIFIER не только позволяет разработчикам называть процедуры с использованием зарезервированных слов, она чаще применяется в хранимых процедурах для работы с объектами, названия которых содержат зарезервированные слова, пробелы или другие, обычно недопустимые символы. Вот пример:

USE Northwind

SET 0UOTED IDENTIFIER ON

IF OBJECT ID(dbo.listorders) IS NOT NULL

DROP PROC dbo.listorders

CREATE PROC dbo.listorders AS

SELECT * FROM Order Details GO

SET QUOTED IDENTIFIER OFF GO

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

OrderlD ProductID UnitPrice Quantity Discount

10248 11 14.0000 12 0.0 ,

10248 42 9.8000 10 0.0

10248 72 34.8000 5 0.0

10249 14 18.6000 9 0.0

10249 51 42.4000 40 0,0

10250 41 7.7000 10 0,0

Таблица Order Details (из базы данных Northwind, поставляемой в качестве примера) содержит и зарезервированное слово, и пробел, поэтому просто так на нее ссылаться нельзя. В этом случае .мы включили поддержку идентификаторов Б кавычках и заключили имя таблицы в двойные кавычки. Однако лучще использовать квадратные скобки ([]), поскольку в этом случае отпадает необходи-.мость из.менять какие-либо параметры. Имейте в виду, что имена объектов в квадратных скобках не поддерживаются стандарто.м ANSI/ISO SQL - это расширение SQL Server. Настройка ANSI NULLS также важна в хранимых процедурах. Она контролирует, разрешены ли He-ANSI-сравнения на равенство с неопределенными значениями. Это особенно важно для хранимых пропелур, параметры которых могут иметь значение NULL Вот пример:



1 ... 29 30 31 32 33 34 35 ... 55
© 2004-2025 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки.
Яндекс.Метрика