Datenbanken und mehr

13. Dezember 2007

Upload-Only Artikel in Merge Replikation

Gespeichert unter: Replikation — Urs Gehrig @ 21:02

Musstes du in einer Merge Replikation auch schon Datensätze nur vom Subscriber zum Publisher schicken; mit Betonung auf nur. Wofür ich das brauche? Zum Beispiel in einer Mobilen Applikation, mit welcher auf dem Mobile Device Stundenrapporte vor Ort beim Kunde erfasst werden. Sobald der Mitarbeiter wieder im Office ist, müssen diese Rapporte auf den Server, damit seine Leistungen auch fakturiert werden können. Ein runterholen von alten Rapporten auf das Device macht aber absolut keinen Sinn, verbraucht auf dem Device nur unnötig kostbaren Speicherplatz und kann erst noch ein Datenschutzproblem beinhalten. Kurzum; Upload-Only Artikel machen absolut Sinn!

Leider kennt SQL Server 2005 kein Upload-Only Property für Artikel; ganz im Gegensatz zu Download-Only. Dies ist aber kein Beinbruch – mit einem kleinen Trick schaffen wir auch dies. Das ganze kann mit einem einfachen static row filter realisiert werden:

WHERE 1 = 2

Wie funktioniert dies? Ganz einfach: Beim Runterladen vom Publisher zum Subscriber wird das Filter angewandt; eins kann aber nie gleich zwei sein und somit kommt keine einzige Row zum Subscriber runter. Anders sieht es beim Hochladen aus. Dort werden nämlich immer alle Änderungen zum Publisher gesandt; die Filter werden nicht berücksichtigt. Somit kommen die erfassten Rapporte zum Server. Beim nächsten Runterladen werden die ‚alten’ Rapporte auf dem Device gelöscht, da ja keine Row unser Filterkriterium erfüllen kann. Et voliá – das war’s, einfach und effizient.

11. Dezember 2007

Neu in Katmaii – GROUPING SETS

Gespeichert unter: Katmai, T-SQL — Urs Gehrig @ 08:54

Hast du schon mal probiert, mit SQL Server 2005 in ein und demselben Query mehrere GROUP BY Kriterien miteinander zu verbinden? Mit CUBE und ROLLUP kommst du bestimmt schon weit, mit der in Katmaii neuen GROUPING SETS Klausel sind dir nun aber praktisch keine Grenzen mehr gesetzt. Warum die ganzen Kriterien in bloss einem SQL Statement und nicht mit mehren, welche du mit UNION zusammen fügst? Naja, geht bestimmt, aber wir wollen ja ein effizientes Query. Nun aber zu GROUPING SETS. Fangen wir mit einem Beispiel an:

USE AdventureWorks;
GO

SELECT CustomerID
    
, SalesPersonID
    
, YEAR(OrderDate) AS OrderYear
    
, MONTH(OrderDate) AS OrderMonth
    
, SUM(SubTotal) AS Total
FROM Sales.SalesOrderHeader
WHERE CustomerID < 10
GROUP BY
GROUPING SETS
(
 
(CustomerID, SalesPersonID),
 
(CustomerID),
 
(SalesPersonID)
),
GROUPING SETS
(
 
(YEAR(OrderDate), MONTH(OrderDate)),
 (YEAR(OrderDate))
)
ORDER BY CustomerID, SalesPersonID, OrderYear, OrderMonth

Was macht dieses Query? Nichts anderes als insgesamt sechs verschiedene GROUP BY’s. Nämlich

  1. GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate), MONTH(OrderDate)
  2. GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate)
  3. GROUP BY CustomerID, YEAR(OrderDate), MONTH(OrderDate)
  4. GROUP BY CustomerID, YEAR(OrderDate)
  5. GROUP BY SalesPersonID, YEAR(OrderDate), MONTH(OrderDate)
  6. GROUP BY SalesPersonID, YEAR(OrderDate)

Kommt in einer GROUB BY Klausel ein einzelnes Feld nicht vor, erhält das Resultat an der entsprechenden Stelle den Wert NULL. Das Ergebnis aus dem obigen Query sieht in etwa wie folgt aus; damit denke ich, dass du die Funktionsweise von GROUPING SETS nun verstehst, auch ohne dass ich hierzu noch mehr Worte verliere:

CustomerID SalesPersonID OrderYear OrderMonth Total
NULL 268 2002 7 3569.4338
NULL 275 2003 1 97037.566
NULL 275 2003 4 94133.8413
NULL 275 2003 7 73368.0931
NULL 275 2003 10 73455.3404
NULL 275 2004 NULL 176878.6938
NULL 275 2004 3 15431.5196
NULL 275 2004 6 31559.7518
NULL 276 2002 10 2449.6033
NULL 276 2003 1 1769.1174
NULL 276 2003 9 59.9326
NULL 276 2004 NULL 2696.2418
NULL 276 2004 6 2137.231
NULL 277 2001 9 18555.8149
NULL 277 2002 NULL 390424.4465
NULL 277 2002 6 11796.1804
NULL 277 2002 9 71112.1316
NULL 277 2002 12 51198.5404
NULL 279 2002 11 290.1614
NULL 279 2003 2 4903.775
NULL 279 2003 8 10309.0561
NULL 279 2004 NULL 14645.1583
NULL 279 2004 5 8441.6436
NULL 280 2001 8 13216.0537
NULL 280 2002 NULL 65489.709
NULL 280 2002 5 31423.5209
NULL 281 2002 9 20720.6175
NULL 281 2003 NULL 54485.9727
NULL 281 2003 6 9134.6608
NULL 281 2003 12 18431.5666
NULL 281 2004 3 7950.2303
NULL 283 2002 NULL 14166.2185
NULL 283 2002 11 4949.8589
NULL 283 2003 2 1574.1247
NULL 283 2003 8 3534.1671
NULL 283 2004 NULL 4490.7426
NULL 283 2004 5 822.009
1 NULL 2001 8 13216.0537
1 NULL 2002 NULL 65489.709
1 NULL 2002 5 31423.5209
1 280 2001 8 13216.0537
1 280 2002 NULL 65489.709
1 280 2002 5 31423.5209
2 NULL 2002 8 9216.3596
2 NULL 2003 NULL 10966.5406
2 NULL 2003 5 1751.5987
2 NULL 2003 11 4106.6501
2 NULL 2004 2 3668.7336
2 283 2002 NULL 14166.2185
2 283 2002 11 4949.8589
2 283 2003 2 1574.1247
2 283 2003 8 3534.1671
2 283 2004 NULL 4490.7426
2 283 2004 5 822.009
3 NULL 2001 9 18555.8149
3 NULL 2002 NULL 152392.4906
3 NULL 2002 6 11796.1804
3 NULL 2002 12 51198.5404
3 NULL 2003 3 27899.9579
3 NULL 2003 9 83436.1754
3 NULL 2004 NULL 46991.2714
3 NULL 2004 6 31559.7518
3 275 2003 3 27899.9579
3 275 2003 9 83436.1754
3 275 2004 NULL 46991.2714
3 275 2004 6 31559.7518
3 277 2001 9 18555.8149
3 277 2002 NULL 152392.4906
3 277 2002 6 11796.1804
3 277 2002 12 51198.5404
4 NULL 2002 7 118394.1258
4 NULL 2003 NULL 337994.8408
4 NULL 2003 4 94133.8413
4 NULL 2003 10 73455.3404
4 NULL 2004 1 67414.7924
4 275 2003 NULL 337994.8408
4 275 2003 4 94133.8413
4 275 2003 10 73455.3404
4 275 2004 1 67414.7924
4 277 2002 NULL 238031.9559
4 277 2002 10 119637.8301
5 NULL 2002 9 20720.6175
5 NULL 2003 NULL 54485.9727
5 NULL 2003 6 9134.6608
5 NULL 2003 12 18431.5666
5 NULL 2004 3 7950.2303
5 281 2002 NULL 30199.7195
5 281 2002 12 9479.102
5 281 2003 3 8456.292
5 281 2003 9 18463.4533
5 281 2004 NULL 18679.7381
5 281 2004 6 10729.5078
6 NULL 2003 9 59.9326
6 NULL 2004 NULL 2696.2418
6 NULL 2004 6 2137.231
6 276 2003 9 59.9326
6 276 2004 NULL 2696.2418
6 276 2004 6 2137.231
7 NULL 2002 7 3569.4338
7 NULL 2003 NULL 3365.4121
7 NULL 2003 4 1596.2947
7 268 2002 7 3569.4338
7 276 2002 10 2449.6033
7 276 2003 1 1769.1174
8 NULL 2003 NULL 17592.0783
8 NULL 2003 11 8888.6076
8 NULL 2004 2 5571.0288
8 279 2003 NULL 17592.0783
8 279 2003 11 8888.6076
8 279 2004 2 5571.0288
9 NULL 2002 NULL 290.1614
9 NULL 2003 NULL 10318.1878
9 NULL 2003 5 586.989
9 NULL 2003 11 3221.8384
9 NULL 2004 2 632.4859
9 279 2002 NULL 290.1614
9 279 2003 NULL 10318.1878
9 279 2003 5 586.989
9 279 2003 11 3221.8384
9 279 2004 2 632.4859

Bloggen Sie auf WordPress.com.