webForumDet fria alternativet

T-SQL Coding Standards

6 svar · 358 visningar · startad av Engine^

Engine^Medlem sedan dec. 20002 861 inlägg
#1

Eftersom jag och många andra gillar lättläst kod tänkte jag att följande artikel kan vara läsvärd.

http://msdn.microsoft.com/sql/default.aspx?pull=/library/en-us/dnsqlpro04/html/sp04l9.asp

BrimbaMedlem sedan dec. 19992 966 inlägg
#2

Jag skulle aldrig formatera min kod på det sättet. Väldigt otydligt tycker jag. Såhär skriver jag:

SELECT 
	C.Name, 
	E.NameLast,
	E.NameFirst,
	E.Number,
	ISNULL(I.Description,'NA') AS Description
FROM 
	tblCompany AS C
	JOIN tblEmployee AS E ON C.CompanyID = E.CompanyID
    	LEFT JOIN tblCoverage AS V ON E.EmployeeID = V.EmployeeID
	LEFT JOIN tblInsurance AS I ON V.InsuranceID = I.InsuranceID
WHERE 
	C.Name LIKE @Name
	AND V.CreateDate > CONVERT(smalldatetime,'01/01/2000')
ORDER BY 
	C.Name,
	E.NameLast,
	E.NameFirst,
	E.Number,
	ISNULL(I.Description,'NA')

SELECT 
	@Retain = @@ERROR, 
	@Rows = @@ROWCOUNT

IF @Status = 0 
	SET @Status = @Retain

Förändringar

1: kommatechen direkt efter istället för radbrytning och sedan komma.
2: JOINS på en rad istället för flera
3: Radbrytning och tab efter SELECT, FROM, WHERE osv.
4: Efter IF, gör radbrytning och TAB (4 space)

Sedan har jag lite förtjust i att ge alias av typen t1, t2, t3 osv. Detta för att man ändå sällan vet vad en bokstav står . Däremot tycker jag att ögat tydligare ser t1, t2 osv än att ha olika bokstäver som representerar tabellerna. Men trots att det är vad jag gillar bäst så kan jag inte rekommendera det som en standard utan håller nog med där att man skall försöka korta ner det så som det är gjort här.

Såhär ser det ut med t1,t2 osv :)

SELECT 
	t1.Name, 
	t2.NameLast,
	t2.NameFirst,
	t2.Number,
	ISNULL(t4.Description,'NA') AS Description
FROM 
	tblCompany AS t1
	JOIN tblEmployee AS t2 ON t1.CompanyID = t2.CompanyID
    	LEFT JOIN tblCoverage AS t3 ON t2.EmployeeID = t3.EmployeeID
	LEFT JOIN tblInsurance AS t4 ON t3.InsuranceID = t4.InsuranceID
WHERE 
	t1.Name LIKE @Name
	AND t3.CreateDate > CONVERT(smalldatetime,'01/01/2000')
ORDER BY 
	t1.Name,
	t2.NameLast,
	t2.NameFirst,
	t2.Number,
	ISNULL(t4.Description,'NA')

SELECT 
	@Retain = @@ERROR, 
	@Rows = @@ROWCOUNT

IF @Status = 0 
	SET @Status = @Retain
tohaMedlem sedan dec. 1999698 inlägg
#3

Mycket prydligt Brimba. Jag skriver nästa likadant men fler radbrytningar vid join, AND/OR/ELSE samt paranterser på egen rad i where:


SELECT 
	C.Name, 
	E.NameLast,
	E.NameFirst,
	E.Number,
	ISNULL(I.Description,'NA') AS Description
FROM 
	tblCompany AS C

[b]	JOIN 
	tblEmployee AS E
	ON 
	C.CompanyID = E.CompanyID

    	LEFT JOIN 
	tblCoverage AS V 
	ON 
	E.EmployeeID = V.EmployeeID

	LEFT JOIN 
	tblInsurance AS I 
	ON 
	V.InsuranceID = I.InsuranceID
	AND
	V.InsuranceID = I.InsuranceID[/b]
WHERE 
	C.Name LIKE @Name
	AND
	V.CreateDate > CONVERT(smalldatetime,'01/01/2000')
[b]	OR
	(
		C.Status = 10
		AND
		C.Name = 'Administrator'
	)[/b]

ORDER BY 
	C.Name,
	E.NameLast,
	E.NameFirst,
	E.Number,
	ISNULL(I.Description,'NA')

SELECT 
	@Retain = @@ERROR, 
	@Rows = @@ROWCOUNT

IF @Status = 0 
	SET @Status = @Retain
ConnyFoxMedlem sedan aug. 20011 201 inlägg
#4

Och så har man lärt sig något nytt ;D

Engine^Medlem sedan dec. 20002 861 inlägg
#5

Brimba skrev:

Jag skulle aldrig formatera min kod på det sättet. Väldigt otydligt tycker jag.

Förmodligen inte jag heller, men det är ju en bra början för dom som funderar på att skriva snyggare kod ;)

Punkterna är väl det jag tycker är mest intressant.

HansenMedlem sedan aug. 2000383 inlägg
#6

Mina har en tendens till att se ut ~ här:

   SELECT C.Name, 
          E.NameLast,
          E.NameFirst,
          E.Number
     FROM tblCompany AS C
          JOIN tblEmployee AS E 
            ON( C.CompanyID = E.CompanyID )
          LEFT JOIN tblCoverage AS V 
            ON( E.EmployeeID = V.EmployeeID )
          LEFT JOIN tblInsurance AS I 
            ON(     V.InsuranceID = I.InsuranceID
                AND V.InsuranceID = I.InsuranceID )
    WHERE C.Name LIKE @Name
      AND (    V.CreateDate > CONVERT(smalldatetime,'01/01/2000')
            OR V.CreateDate < CONVERT(smalldatetime,'01/01/2000') 
            OR (     V.CreateDate < CONVERT(smalldatetime,'01/01/2000') 
                 AND V.CreateDate < CONVERT(smalldatetime,'01/01/2000') ) )
 ORDER BY C.Name,
          E.NameLast,
          E.NameFirst,
          E.Number
LaspMedlem sedan juli 200010 197 inlägg
#7

Oavsett så har ni ju alla flera bra sätt mot gängse klumpa ihop kod som många sql generatorer levererar.
Det börja ju komma fram en del formaterare så det kanske blir bättre med tiden.
Det viktigaste är väl att man själv förstår att det måste skrivas bättre(mer lättläst) kod.

Genererad på 403 ms · cache AV · v20260730165559-full.f96bc7eb