Original von Brad M. McGehee; deutsche Übersetzung von Frank Kalis
Wenn Ihr unternehmenskritischer SQL Server mit einem Motherboard Fehler ausfällt, wie lange wird die Ausfallszeit sein? Eine Stunde, vier Stunden, ein Tag oder länger? Wieviel wird dies IhrUnternehmen an entgangenem Umsatz oder Produktivität kosten? Und vielleicht noch wichtiger für Sie selber, was bedeutet dies für Ihren Stress Level?
Man sollte keine Befehle mit xp_cmdshell ausführen, die irgendeine Interaktion mit dem Benutzer erwarten. Diese warten dann auf irgendwelche Aktionen seitens des Benutzer, die nicht stattfinden und scheinen sich *aufgehängt* zu haben.
Ein Bespiel hierfür ist:
SELECT CAST(OBJECT_NAME(sysind.id) AS CHAR(20)) AS TableName , CAST(sysind.name AS CHAR(30)) AS IdxName , CAST(sysfg.groupname AS CHAR(10)) AS GroupName FROM sysindexes sysind INNER JOIN sysfilegroups sysfg ON sysind.groupid = sysfg.groupid INNER JOIN sysobjects sysobj ON sysind.id = sysobj.id WHERE sysobj.xtype <> 'S' AND sysind.name NOT LIKE '_WA%' ORDER BY TableName
Eigentlich würde man so eine Aufgabe wahrscheinlich besser im Client code verarbeiten, aber wenn's denn unbedingt der Server sein soll, könnte dies folgendermaßen aussehen:
DECLARE @date DATETIME
SET @date = '19.10.2003 09:48:22'
SELECT
CAST(
CONVERT(CHAR(4), YEAR(@date)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, MONTH(@date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DAY(@date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DATEPART(hour, @date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DATEPART(minute,@date)), 2)) +
CONVERT(CHAR(2), RIGHT('0' + CONVERT(VARCHAR, DATEPART(second,@date)), 2))
AS CHAR(14))
/*oder*/
SELECT
SUBSTRING(REPLACE(REPLACE(REPLACE(CONVERT(CHAR,@date,120),'-',''),' ',''),':',''),1,14)
--------------
20031019094822
(1 row(s) affected)
--------------
20031019094822
(1 row(s) affected)
Nachtrag 20.09.2004: Offentsichtlich geht es auch noch eine Spur einfacher:
DECLARE @date DATETIME
SET @date = '19.10.2003 09:48:22'
SELECT
REPLACE(REPLACE(REPLACE(CONVERT(CHAR,@date,120),'-',''),' ',''),':','')
-------------------
20031019094822
(1 row(s) affected)
Die Ermittlung bestimmter Tage taucht in dieser oder jener Form immer mal wieder auf. T-SQL bietet hierfür sehr wirkungsvolle Methoden an:
DECLARE @dt DATETIME
SET @dt = GETDATE()
SELECT
CAST(CAST(YEAR(@dt) AS CHAR(4))+'0101' AS DATETIME)
AS Jahresanfang
, CAST(CAST(YEAR(@dt) AS CHAR(4))+'-12-31T23:59:59.997' AS DATETIME)
AS Jahresende
Jahresanfang Jahresende
------------------------------------------------------ ------------------------
2004-01-01 00:00:00.000 2004-12-31 23:59:59.997
(1 row(s) affected)
DECLARE @d DATETIME
SET @d = '31/01/2003 12:00:00'
SELECT
DAY(DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DAY(@d),@d)))) AS TageImMonat
TageImMonat
-----------
31
(1 row(s) affected)
Bei der Wahl des Datumsformat muss man vorsichtig sein. So funktionieren zum Beispiel:
SET @d = '20030131 12:00:00'
und
SET @d = '31.01.2003 12:00:00'
während
SET @d = '2003-01-31 12:00:00'
Server: Nachr.-Nr. 242, Schweregrad 16, Status 3, Zeile 2
Bei der Konvertierung ... char-Datentyps in ... datetime-Datentyp ... außerhalb des gültigen Bereichs.
hervorruft.