2009-05-16
SQL Server 2008 Developer Training Kit
http://www.microsoft.com/downloads/details.aspx?FamilyID=E9C68E1B-1E0E-4299-B498-6AB3CA72A6D7&displaylang=en
2008-12-13
Using OPENROWSET to read large files into SQL Server
The BULK option was added to T-SQL in SQL Server 2005 and it persists in SQL Server 2008. When using SQL Server 2000 it was possible to read and write to the file system using the sp_OA_Create and sp_OA_Method extended stored procedures. These XPs continue to work, but are disabled by default because of security concerns and it is a better practice to use more secure capabilities like OPENROWSET when they are available.
http://www.mssqltips.com/tip.asp?tip=1643
2008-08-28
A number of SQL Server 2008 features are not supported by LINQ to SQL
Für mein Blog wollte ich ein Beispiel mit LINQ to SQL und Geo-Daten schreiben und dabei den SQL Server 2008 einsetzen und den neuen Datentyp "geography" verwenden.
Leider wurde meine Arbeit durch die folgende Fehlermeldung unterbrochen, nach dem ich die Address-Tabelle-Table der AdventureWorks-Datenbank-Database auf die LINQ to SQL Designer-Oberfläche gezogen habe: One or more selected items contain a data type that is not supported by the designer.
Den SP 1 - Service Pack 1 für Visual Studio 2008 habe ich bereits installiert gehabt. Nach einer kurze recherche im Internet habe ich kein Eintrag zu diesem Thema gefunden.
Nach einem Post an das LINQ to SQL-Forum hat Damien Guard (Microsoft) folgenden Antwort zurück geschrieben:
A number of SQL Server features are not supported by LINQ to SQL even with SP1 installed - this includes geography and hierarchy types.
Auf meine Frage, ob Sie die neuen Datentypen unterstützen werden, bekam ich folgende Antwort zurück:
Supporting the missing types are on our list of features we'd like to add to the next release but I can't confirm what will make it at this point in time.
Den Forum-Eintrag findet ihr unter: LINQ to SQL Designer and SQL Server 2008 "geography" Data Type
Ich werde euch am laufenden halten, sobald ich Neuigkeiten zu diesem Thema habe.
2008-05-11
Microsoft SQL Server 2008 CTP Unterstützung für Visual Studio 2005 und Visual Studio 2008
SQL Server 2008 CTP Unterstützung für Visual Studio 2005 kann unter folgende URL heruntergeladen werden: Visual Studio 2005 Support for SQL Server 2008 CTP
Für die Einschränkungen und bekannte Fehler (Known Issues) bitte die Informationen auf der Downlad-Seite lesen.
SQL Server 2008 CTP Unterstützung für Visual Studio 2008 kann unter folgende URL heruntergeladen werden: Visual Studio 2008 Support for SQL Server 2008 CTP
Leider Unterstützt dieser Version den LINQ to SQL Designer mit SQL Server 2008 noch nicht.
Auch bei dieser Download, für die Einschränkungen und bekannte Fehler (Known Issues) bitte die Informationen auf der Download-Seite lesen.
Für Allgemeine Informationen über die SQL Server 2008 CTP Unterstützung kann ich Euch folgende Seite empfehlen: Connecting to Microsoft SQL Server 2008 from Microsoft Visual Studio 2005 and 2008
2008-05-04
Übersicht der DateTime-Datentypen in SQL Server 2008
Der folgende Artikel gibt einen Übersicht über die DateTime-Datentypen in SQL Server 2008. Auch die neuen Datentypen wie DATE, DATETIME2, DATETIMEOFFSET, und TIME sind in diesem Artikel beschrieben.
DATE - NEU
Der Datentyp DATE speichert Datumswert ohne Zeit Informationen.
Der Bereich für diesen Datentyp liegt zwischen 0001-01-01 - 9999-12-31 (Jahr - Monat -Tag).
Der Speicherbedarf liegt bei 3 bytes.
1 -- DATE --------------------------------------
2 -- Format : Jahr - Monat - Tag
3 -- Year - Month - Day
4
5 -- Range : 0001-01-01 - 9999-12-31
6 -- Storage Size : 3 bytes
7 -- Default value: 1900-01-01
8 ----------------------------------------------
9
10 -- Beispiel-Code -----------------------------
11 DECLARE @Date_DataType DATE
12 SET @Date_DataType = SYSDATETIME()
13
14 PRINT SYSDATETIME()
15 PRINT @Date_DataType
16 ----------------------------------------------
17
18 -- Resultat ----------------------------------
19 -- SYSDATETIME() : 2008-05-04 16:54:59.0370304
20 -- @Date_DataType: 2008-05-04
21 ----------------------------------------------
22
DATETIME
Der Datentyp DATETIME speichert Datum und Zeit Informationen.
Der Bereich für diesen Datentyp liegt zwischen 1753-01-01 00:00:00 - 9999-12-31 23:59:59.997 (Jahr - Monat - Tag Stunden : Minuten : Sekunden .Sekundenbruchteile).
Die Genauigkeit der Sekundenbruchteile kann bei diesem Datentyp nicht festgelegt werden.
Der Speicherbedarf liegt bei 8 bytes.
1 -- DATETIME --------------------------------------------------------------------------
2 -- Format : Jahr - Monat - Tag Stunden : Minuten : Sekunden .Sekundenbruchteile
3 -- Year - Month - Day Hours : Minutes : Seconds .Fractional Seconds
4
5 -- Range : 1753-01-01 00:00:00 - 9999-12-31 23:59:59.997
6 -- Storage Size : 8 bytes
7 -- Default value: 1900-01-01 00:00:00
8 ---------------------------------------------------------------------------------------
9
10 -- Beispiel-Code ----------------------------------------------------------------------
11 DECLARE @DateTime_DataType DATETIME
12 SET @DateTime_DataType = SYSDATETIME()
13
14 PRINT SYSDATETIME()
15 PRINT @DateTime_DataType
16 ---------------------------------------------------------------------------------------
17
18 -- Resultat ---------------------------------------------------------------------------
19 -- SYSDATETIME() : 2008-05-04 16:29:41.1544224
20 -- @DateTime_DataType: 2008-05-04 16:51
21 ---------------------------------------------------------------------------------------
22
DATETIME2 - NEU
Als Erweiterung des Datentyps DATETIME, speichert DATETIME2 einen größeren Datumsbereich und eine größere Genauigkeit beim Sekundenbruchteil.
Der Bereich für diesen Datentyp liegt zwischen 0001-01-01 00:00:00 - 9999-12-31 23:59:59.9999999 (Jahr - Monat - Tag Stunden : Minuten : Sekunden [.Sekundenbruchteile]).
Die Genauigkeit der Sekundenbruchteile kann beim Deklarieren der Variable festgelegt werden, welches zwischen 0 und 7 sein kann.
Der Speicherbedarf liegt bei 8 bytes.
1 -- DATETIME2 ---------------------------------------------------------------------------
2 -- Format : Jahr - Monat - Tag Stunden : Minuten : Sekunden [.Sekundenbruchteile]
3 -- Year - Month - Day Hours : Minutes : Seconds [.Fractional Seconds]
4
5 -- Range : 0001-01-01 00:00:00 - 9999-12-31 23:59:59.9999999
6 -- Storage Size : 8 bytes
7 -- Default value: 1900-01-01 00:00:00
8 ----------------------------------------------------------------------------------------
9
10 -- Beispiel-Code -----------------------------------------------------------------------
11 DECLARE @DateTime2_DataType DATETIME2(7)
12 SET @DateTime2_DataType = SYSDATETIME()
13
14 PRINT SYSDATETIME()
15 PRINT @DateTime2_DataType
16 ----------------------------------------------------------------------------------------
17
18 -- Resultat ----------------------------------------------------------------------------
19 -- SYSDATETIME() : 2008-05-04 16:22:33.6997728
20 -- @DateTime2_DataType: 2008-05-04 16:22:33.6997728
21 ----------------------------------------------------------------------------------------
22
DATETIMEOFFSET - NEU
Der Datentyp DATETIMEOFFSET speichert zusätzlich zu den Datumsangaben mit Zeit Informationen auch die Zeitzonen Information.
Der Bereich für diesen Datentyp liegt zwischen 0001-01-01 00:00:00 - 9999-12-31 23:59:59.9999999 (Jahr - Monat - Tag Stunden : Minuten : Sekunden [.Sekundenbruchteile] [+|- Stunden : Minuten]).
Die Genauigkeit der Sekundenbruchteile kann beim Deklarieren der Variable festgelegt werden, welches zwischen 0 und 7 sein kann.
Der Speicherbedarf liegt bei 10 bytes.
1 -- DATETIMEOFFSET -----------------------------------------------------------------------------------------------
2 -- Format : Jahr - Monat - Tag Stunden : Minuten : Sekunden [.Sekundenbruchteile] [+|- Stunden : Minuten]
3 -- Year - Month - Day Hours : Minutes : Seconds [.Fractional Seconds] [+|- Hours : Minutes]
4
5 -- Range : 0001-01-01 00:00:00 - 9999-12-31 23:59:59.9999999
6 -- Storage Size : 10 bytes
7 -- Default value: 1900-01-01 00:00:00 00:00
8 -----------------------------------------------------------------------------------------------------------------
9
10 -- Beispiel-Code ------------------------------------------------------------------------------------------------
11 DECLARE @DateTimeOffset_DataType DATETIMEOFFSET(7)
12 SET @DateTimeOffset_DataType = SYSDATETIME()
13
14 PRINT SYSDATETIME()
15 PRINT @DateTimeOffset_DataType
16 -----------------------------------------------------------------------------------------------------------------
17
18 -- Resultat -----------------------------------------------------------------------------------------------------
19 -- SYSDATETIME() : 2008-05-04 13:59:59.9918208
20 -- @DateTimeOffset_DataType: 2008-05-04 13:59:59.9918208 +00:00
21 -----------------------------------------------------------------------------------------------------------------
22
Für die manueller Zuweisung eines Wertes muss ein spezielles Format eingehalten werden. In diesem Format sind die Datumsangaben von den Zeitangaben mit dem Buchstaben „T“ voneinander getrennt. Die Angabe der Zeitzone erfolgt nach Sekundenbruchteile und beginnt mit einem „+“ oder „-„.
1 -- Beispiel-Code ------------------------------------------------------------------------------------------------
2 SET @DateTimeOffset_DataType = '2008-05-04T13:59:59.9918208+00:00'
3
4 PRINT @DateTimeOffset_DataType
5 -----------------------------------------------------------------------------------------------------------------
6
7 -- Resultat -----------------------------------------------------------------------------------------------------
8 -- @DateTimeOffset_DataType: 2008-05-04 13:59:59.9918208 +00:00
9 -----------------------------------------------------------------------------------------------------------------
10
Der Format des DATETIMEOFFSET Datentyps entspricht dem ISO 8601.
ISO 8601 ist ein internationaler Standard der ISO, der numerische Datumsformate und Zeitangaben beschreibt und Empfehlungen für den Gebrauch im internationalen Kontext ausspricht. Der Titel der Norm ist Data elements and interchange formats -- Information interchange -- Representation of dates and times, was im deutschen „Datenelemente und Austauschformate; Informationsaustausch; Darstellung von Datum und Uhrzeit“ bedeutet.
Quelle: Wikipedia
SMALLDATETIME
Der Datentyp SMALLDATETIME speichert Datumsangaben mit Zeit Information im 24-Stunden-Format ohne Sekundenbruchteile.
Der Bereich für diesen Datentyp liegt zwischen 1900-01-01 00:00:00 - 2079-06-06 23:59:59 (Jahr - Monat - Tag Stunden - Minuten – Sekunden).
1 -- SMALLDATETIME -------------------------------------------------
2 -- Format : Jahr - Monat - Tag Stunden : Minuten : Sekunden
3 -- Year - Month - Day Hours : Minutes : Seconds
4
5 -- Range : 1900-01-01 00:00:00 - 2079-06-06 23:59:59
6 -- Storage Size : 4 bytes
7 -- Default value: 1900-01-01 00:00:00
8 -----------------------------------------------------------------
9
10 -- Beispiel-Code ------------------------------------------------
11 DECLARE @SmallDateTime_DataType SMALLDATETIME
12 SET @SmallDateTime_DataType = SYSDATETIME()
13
14 PRINT SYSDATETIME()
15 PRINT @SmallDateTime_DataType
16 -----------------------------------------------------------------
17
18 -- Resultat -----------------------------------------------------
19 -- SYSDATETIME() : 2008-05-04 13:30:56.9855008
20 -- @SmallDateTime_DataType: 2008-05-04 13:31
21 -----------------------------------------------------------------
22
Die Minuten werden aufgerundet, wenn die Sekunden größer sind als 29.
TIME - NEU
Der Datentyp TIME speichert die Zeit ohne Datumsangaben im 24-Stunden-Format.
Der Bereich für diesen Datentyp liegt zwischen 00:00:00.0000000 und 23:59:59.9999999 (Stunden : Minuten : Sekunden [.Sekundenbruchteile]).
Die Genauigkeit der Sekundenbruchteile kann beim Deklarieren der Variable festgelegt werden, welches zwischen 0 und 7 sein kann.
1 -- TIME -----------------------------------------------------------
2 -- Format : Stunden : Minuten : Sekunden . Sekundenbruchteile
3 -- Hours : Minutes : Seconds . Fractional Seconds
4
5 -- Range : 00:00:00.0000000 - 23:59:59.9999999
6 -- Storage Size : 3 - 5 bytes
7 -- Default value: 00:00:00
8 -------------------------------------------------------------------
9
10 -- Beispiel-Code --------------------------------------------------
11 DECLARE @Time_DataType TIME(7)
12 SET @Time_DataType = SYSDATETIME()
13
14 PRINT SYSDATETIME()
15 PRINT @Time_DataType
16 -------------------------------------------------------------------
17
18 -- Resultat -------------------------------------------------------
19 -- SYSDATETIME() : 2008-05-04 13:00:15.0369088
20 -- @Time_DataType: 13:00:15.0369088
21 -------------------------------------------------------------------
22
Die Beispieldatei findet Ihr unter: DateTime_DataTypes_Sample_0001.sql
2008-04-20
MERGE-Statement in Microsoft SQL Server 2008
Mit Hilfe des MERGE-Statements können die Daten aus der Quelle in die Ziel-Tabelle unter bestimmten Bedingungen transferiert werden.
Das MERGE-Statement in Microsoft SQL Server 2008 kann in die Ziel-Tabelle neuen Datensätze hinzufügen oder die bestehenden Datensätze aktualisieren. Dabei können Kriterien definiert werden, unter welche Bedingung ein Datensatz in der Ziel-Tabelle aktualisiert oder hinzugefügt werden soll. Die Löschung einen Datensatz in der Ziel-Tabelle kann ebenfalls mit Hilfe des MERGE-Statements implementiert werden.
Der folgende Beispiel-Code erstellt in der Datenbank zwei neue Datenbanktabellen mit dem Namen Country1 (C1) und Country2 (C2). Die Tabelle C1 wird als Ziel und C2 wird als Quelle in dem Beispiel verwendet. In der C1 werden drei neue Einträge und in der C2 werden vier neue Einträge erstellt.
-- Erstellen Ziel-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country1](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen drei neue Datensätze in der Datenbanktabelle Country1 (Ziel)
INSERT INTO [dbo].[Country1] ([ID], [Country])
SELECT 1, 'SWITZERLAND' UNION ALL
SELECT 2, 'GERMANY' UNION ALL
SELECT 3, 'AUSTRIA'
-- Erstellen Quelle-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country2](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen vier Datensätze in der Datenbanktabelle Country2 (Quelle)
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (1, 'SWITZERLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (2, 'DEUTSCHLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (4, 'TURKIYE')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (5, 'ITALY')
Für den INSERT darf die ID der C2-Tabelle in der C1-Tabelle nicht vorkommen (TARGET NOT MATCHED THEN):
MERGE [Country1] AS C1
USING [Country2] AS C2
ON C1.ID = C2.ID
-- Wenn, ID der C2 in der Tabelle C1 nicht vorhanden ist,
-- dann wird der Datensatz in der C1 erstellt (INSERT)
WHEN TARGET NOT MATCHED THEN
INSERT (ID, Country)
VALUES (C2.ID, C2.Country)
Und für den UPDATE muss die ID der C1-Tabelle in der C2-Tabelle vorhanden sein (MATCHED AND C1.ID = C2.ID):
-- Wenn, ID der C2 in der Tabelle C1 vorhanden ist,
-- dann wird der Datenatz in der C1 aktualisert (UPDATE)
WHEN MATCHED AND C1.ID = C2.ID THEN
UPDATE SET Country = C2.Country;
Der ganze Beispielcode ist unten aufgelistet:
--BEGIN TRANSACTION
-- Wenn die Datenbanktabelle Country1 (Ziel) oder Country2 (Quelle) in der Datenbank bereits exisitiert,
-- werden sie zuerst gelöscht.
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Country1]') AND type in (N'U'))
DROP TABLE [dbo].[Country1]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Country2]') AND type in (N'U'))
DROP TABLE [dbo].[Country2]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Erstellen Ziel-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country1](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen drei neue Datensätze in der Datenbanktabelle Country1 (Ziel)
INSERT INTO [dbo].[Country1] ([ID], [Country])
SELECT 1, 'SWITZERLAND' UNION ALL
SELECT 2, 'GERMANY' UNION ALL
SELECT 3, 'AUSTRIA'
-- Erstellen Quelle-Tabelle in einer SQL Server Datenbank
CREATE TABLE [dbo].[Country2](
[ID] [int] NOT NULL,
[Country] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL)
-- Erstellen vier Datensätze in der Datenbanktabelle Country2 (Quelle)
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (1, 'SWITZERLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (2, 'DEUTSCHLAND')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (4, 'TURKIYE')
INSERT INTO [dbo].[Country2] ([ID],[Country]) VALUES (5, 'ITALY')
-- Ausgeben Inhalte der beiden Tabellen
SELECT * FROM Country1
SELECT * FROM Country2
-- Verwendung MERGE-Statement
MERGE [Country1] AS C1
USING [Country2] AS C2
ON C1.ID = C2.ID
-- Wenn, ID der C2 in der Tabelle C1 nicht vorhanden ist,
-- dann wird der Datensatz in der C1 erstellt (INSERT)
WHEN TARGET NOT MATCHED THEN
INSERT (ID, Country)
VALUES (C2.ID, C2.Country)
-- Wenn, ID der C2 in der Tabelle C1 vorhanden ist,
-- dann wird der Datenatz in der C1 aktualisert (UPDATE)
WHEN MATCHED AND C1.ID = C2.ID THEN
UPDATE SET Country = C2.Country;
-- Ausgeben Inhalte der beiden Tabellen
SELECT * FROM Country1
SELECT * FROM Country2
--ROLLBACK TRANSACTION
Wenn die Daten der Tabelle C1 vor und nach Verwendung des MERGE-Statements verglichen werden, sehen die Daten wie folgt aus:
Bemerkung: Die Verwendung von BEGIN und ROLLBACK-Transaction haben keinen Einfluss auf das Beispiel. Ich wollte nur meine Datenbank sauber halten :-)
2008-04-13
Variable Deklaration und Wert-Zuweisung in Microsoft SQL Server 2008
Die Variablen Deklaration und Wert-Zuweisung in T-SQL erfolgte in zwei Schritten. Zuerst musste die Variable deklariert und dann der gewünschte Wert zugewiesen werden.
Der folgende Beispielcode wird vielen T-SQL Entwickler bekannt vorkommen:
DECLARE @Variable1 INT
DECLARE @Variable2 NVARCHAR(50)
SET @Variable1 = 100
SET @Variable2 = 'Text Variable'
Neu in Microsoft SQL Server 2008 wurde dieser Vorgang vereinfacht. Es sind nicht mehr zwei Schritten Notwendig um einen Variablen zu deklarieren und einen Wert zuzuweisen.
DECLARE @Variable1 INT = 100
DECLARE @Variable2 NVARCHAR(100) = 'Text Variable'
Wenn die Deklaration und Wert-Zuweisung von den Variablen hintereinander erfolgt, kann auch die folgende Syntax verwendet werden:
DECLARE @Variable1 INT = 100,
@Variable2 NVARCHAR(100) = 'Text Variable'