Для определения и уничтожение курсора рекомендуется пользоваться макросами
Пример.
Правильно | Не рекомендуется |
__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 и т.д.. На данную структуру существуют ограничения и требования к написанию с точки зрения стандартов. Все данные требования и ограничения сформированы исходя из принципов легкой последующей читаемости исходных текстов, а также принципов целостности производимых операций.