Для определения и уничтожение курсора рекомендуется пользоваться макросами

Пример.

Правильно Не рекомендуется
__DECLARE_CURSOR__ MyCursor __DEALLOCATE_CURSOR__ MyCursor declare MyCursor insensitive cursor for deallocate #ifdef SYB_STYLE cursor #endif MyCursor  
__DEALLOCATE_CURSOR__ MyCursor __DEALLOCATE_CURSOR__ MyCursor

Оператор CREATE PROC

Параметры, создаваемой процедуры должны располагаться с новой строки, с отступом в 2 символа от имени процедуры, один под другим, с одной и той же колонки.

Пример.

Правильно
create proc Audit_Insert @Action DSTINYINT = NULL, @ObjectID DSIDENTIFIER = NULL, …
Неправильно
create proc Audit_Insert @Action DSTINYINT = NULL, @ObjectID DSIDENTIFIER = NULL, …

Оператор EXEC

Параметры, передаваемые вызываемым процедурам, должны располагаться с новой строки, с отступом в 2 символа от имени процедуры, один под другим, с одной и той же колонки.

Пример.

Правильно Неправильно
exec MyProc @ID = @ID out, @ObjectID = @ObjID   exec MyProc @ID out, @ObjectID exec MyProc @ID out, @ObjectID

В случае если вызов процедуры с указанными параметрами и отступами не превышает 80 символов, допускается написание вызова процедуры и списка параметров в одну строчку.

Пример.

Правильно Неправильно
exec MyProc @ID = @ID, @ObjectID = @ObjID exec MyProc @ID, @ObjectID  

Параметры хранимым процедурам необходимо передавать по имени, а не по номеру.

Пример.

Правильно Неправильно
exec MyProc @ID = @ID, @ObjectID = @ObjID   exec MyProc @ID, @ObjectID  

Оператор CASE

Формат:

1. Для сложных условий:

Case

when {условия отбора 1}

and {условия отбора 2}

then {код1}

when {условия отбора 3}

and {условия отбора 4}

then {код2}

else {код3}

End

2. Для простых условий, когда длина строки укладывается в 80 символов:

Case

when {условия отбора 1} then {код1}

when {условия отбора 2} then {код2}

else {код3}

End

При написании ключевые слова case и end выравниваются по левому краю в одной колонке, ключевое слово when - на следующей строке со сдвигом вправо на два пробела , ключевые слова then и операторы and, or, использующиеся при описании сложных условий, выравниваются по правому краю колонки. Рекомендуется then переносить на новую строку, т.к. условие может быть громоздким и код который написан после then не поместится на экран, прочитать такое условие будет сложно, тем более провести анализ.

Пример.

Правильно
case when b.timeType = 1 then case when b.time1 <> '19000101' and b.time2 = '19000101' then dateadd(yy,1,b.time1)   when b.time2 <> '19000101' and b.time1 = '19000101' then b.time2   when b.time1 <> '19000101' and b.time2 <> '19000101' then b.time2   else dateadd(yy,1,b.billDate) end   when b.timeType = 2 and b.PresDate = '19000101' then dateadd(yy,1,b.billDate)   else '19000101' end
Неправильно
case when b.timeType = 1 then case when b.time1 <> '19000101' and b.time2 = '19000101' then dateadd(yy,1,b.time1) when b.time2 <> '19000101' and b.time1 = '19000101' then b.time2 when b.time1 <> '19000101' and b.time2 <> '19000101' then b.time2 else dateadd(yy,1,b.billDate) end when b.timeType = and b.PresDate = '19000101' then dateadd(yy,1,b.billDate) when b.timeType = 2 and b.PresDate <>'19000101' then dateadd(dd,b.daysFrom,b.PresDate) when b.timeType = 3 then dateadd(dd,b.daysFrom,b.billDate) when b.timeType = 4 and b.time1 <> '19000101' then b.time1 else '19000101' end

Правила написания запроса при помощи left join и inner join

Формат:

Вариант 1 - без использования ключевого слова outer:

select {присваивание значений}

from {основная таблица}

left join {таблица2}

on {условие 1 на таблицу2}

and {условие 2 на таблицу2}

inner join {таблица3}

on {условие 1 на таблицу3}

Вариант 2 - c использованием ключевого слова outer :

select {присваивание значений}

from {основная таблица}

Left outer

join {таблица2}

on {условие 1 на таблицу2}

and {условие 2 на таблицу2}

inner join {таблица3}

on {условие 1 на таблицу3}

Рекомендуется вариант описания без ключевого слова outer.

4.3.10.2 При написании ключевые слова left [outer] join / inner join, on и операторы and, or использующиеся при описании сложных условий выравниваются по правому краю колонки.

Запрещено смешивать стандарты в одном запросе(или подзапросе) (ANSI, T-SQL). Если в запросе(или подзапросе) в секции from есть inner join или left join, то нельзя использовать в этой секции запятую, и выносить условия присоединения таблиц в where. Запросы должны быть в одном стандарте.

4.3.10.4 При использовании ANSI-стандарта нельзя использовать никакие другие варианты присоединения кроме left [outer] join и inner join, причем для последнего нельзя опускать слово inner. Отказ от outer join, right join и пр. обусловлен тем, что они делают код абсолютно нечитабельным, так как переопределяют порядок присоединения таблиц (мы получаем не тот порядок, в котором эти таблицы следуют друг за другом в секции from).

Пример 1.

Правильно
select a.Date, a.AccDeb, a.AccCre, a.QtyDeb, a.QtyCre, a.SwiftID from #Aviso a left join tSwift sw #M_NOLOCK_INDEX(XPKtSwift) on sw.SwiftID = a.SwiftID inner join tInstitution id #M_NOLOCK_INDEX(XPKtInstitution) on id.InstitutionID = a.InstOwnerDeb inner join tInstitution ic #M_NOLOCK_INDEX(XPKtInstitution) on ic.InstitutionID = a.InstOwnerCre left join tCountry cds #M_NOLOCK_INDEX(XPKtCountry) on cds.CountryID = id.CountryID left join tCountry cdg #M_NOLOCK_INDEX(XPKtCountry) on cdg.CountryID = id.InstGroupID left join tResource r #M_NOLOCK_INDEX(XPKtResource) on r.ResourceID = a.ResourcePsvID left join tPayInstruct p1 #M_NOLOCK_INDEX(XIE2tPayInstruct) on p1.DealTransactID = a.Reference andp1.Type = 2 and p1.Belong = 1  

Пример 2. Синтаксис с использованием outer

Правильно
select a.Date, a.AccDeb, a.AccCre, a.QtyDeb, a.QtyCre, a.SwiftID from #Aviso a left outer join tSwift sw #M_NOLOCK_INDEX(XPKtSwift) on sw.SwiftID = a.SwiftID inner join tInstitution id #M_NOLOCK_INDEX(XPKtInstitution) on id.InstitutionID = a.InstOwnerDeb inner join tInstitution ic #M_NOLOCK_INDEX(XPKtInstitution) on ic.InstitutionID = a.InstOwnerCre left outer join tCountry cds #M_NOLOCK_INDEX(XPKtCountry) on cds.CountryID = id.CountryID left outer join tCountry cdg #M_NOLOCK_INDEX(XPKtCountry) on cdg.CountryID = id.InstGroupID left outer join tResource r #M_NOLOCK_INDEX(XPKtResource) on r.ResourceID = a.ResourcePsvID left outer join tPayInstruct p1 #M_NOLOCK_INDEX(XIE2tPayInstruct) on p1.DealTransactID = a.Reference andp1.Type = 2 and p1.Belong = 1  
Неправильно
select a.Date, a.AccDeb, a.AccCre, a.QtyDeb, a.QtyCre, a.SwiftID from #Aviso a left outer join tSwift sw #M_NOLOCK_INDEX(XPKtSwift) on sw.SwiftID = a.SwiftID inner join tInstitution id #M_NOLOCK_INDEX(XPKtInstitution) on id.InstitutionID = a.InstOwnerDeb inner join tInstitution ic #M_NOLOCK_INDEX(XPKtInstitution) on ic.InstitutionID = a.InstOwnerCre left outer join tCountry cds #M_NOLOCK_INDEX(XPKtCountry) on cds.CountryID = id.CountryID left outer join tCountry cdg #M_NOLOCK_INDEX(XPKtCountry) on cdg.CountryID = id.InstGroupID left outer join tResource r #M_NOLOCK_INDEX(XPKtResource) on r.ResourceID = a.ResourcePsvID left outer join tPayInstruct p1 #M_NOLOCK_INDEX(XIE2tPayInstruct) on p1.DealTransactID = a.Reference andp1.Type = 2and p1.Belong = 1  

Управление транзакциями

Синтаксис языка Transact SQL включает в себя несколько операторов управляющих транзакциями. Это операторы: begin transaction, end transaction и т.д.. На данную структуру существуют ограничения и требования к написанию с точки зрения стандартов. Все данные требования и ограничения сформированы исходя из принципов легкой последующей читаемости исходных текстов, а также принципов целостности производимых операций.

Наши рекомендации