Kategorienarchiv: MSSQL

TSQL group_concat workaround

Group_concat_workaround

Die Funktion group_concat gibt es in Windows-Azure TSQL nicht. Es gibt allerdings Szenarien in denen diese Funktion evtl. sinnvoll ist. Man kann sich mit  „XML PATH“ behelfen: DECLARE @ATable TABLE ( [ID] INT, [Name] CHAR(1)) INSERT INTO @ATable VALUES (1, ‚A‘) INSERT INTO @ATable VALUES (1, ‚B‘) INSERT INTO @ATable VALUES (2, ‚C‘) SELECT * FROM @ATable SELECT [ID], REPLACE(REPLACE(REPLACE( (SELECT [Name] AS A FROM @ATable WHERE ( ID = Results.ID ) FOR XML PATH (“)) , ‚</A><A>‘, ‚, ‚)

Alle Schlüssel in allen Datenbanken neu organisieren (MSSQL > 2004)

SQL-Server-201233

Ja richtig, eigentlich müsste es heißen alle Indizes, aber so kleinlich bin ich gerade mal nicht. Das Ganze pack ich jetzt in eine Stored Procedure und lass es jede Nacht einmal laufen.         DECLARE @Database VARCHAR(255) DECLARE @Table VARCHAR(255) DECLARE @cmd NVARCHAR(500) DECLARE @fillfactor INT SET @fillfactor = 90 DECLARE DatabaseCursor CURSOR FOR SELECT name FROM MASTER.dbo.sysdatabases WHERE name NOT IN (‚master‘,’msdb‘,’tempdb‘,’model‘,’distribution‘) ORDER BY 1 OPEN DatabaseCursor FETCH NEXT FROM DatabaseCursor INTO @Database WHILE @@FETCH_STATUS = 0

Hält eine Doppelte Klammer in SQL-Azure besser als eine Einzelne ?

SQL-Server-201233

Erster Ausdruck: SELECT MAX(Price1) FROM (VALUES (6) ,(3) ,(1) ) AS AllPrices1(Price1) Das Ergebnis des Ersten Ausdrucks wird 6 sein. Zweiter Ausdruck: SELECT MIN(Price) FROM (VALUES (10), (5)) AS AllPrices(Price) das Ergebnis des zweiten Ausdrucks ist 5. An die Stelle der 6 im ersten Ausdruck setze ich nun den zweiten Ausdruck ein: SELECT MAX(Price1) FROM (VALUES (SELECT MIN(Price) FROM (VALUES (10), (5)) AS AllPrices(Price)) ,(3) ,(1) ) AS AllPrices1(Price1) Dieses Konstrukt wirft einen Fehler…. Incorrect syntax near the keyword ‚SELECT‘.

Ändern der Spaltensortierung in MSSQL-Server

SQL-Server-201233

Bei einem Sql-Sortierungskonflikt hilft es oft nur die Sortierung der entsprechenen Spalte zu ändern:         Um die Spaltensortierung heraus zu finden:   SELECT name, collation_name FROM sys.columns WHERE OBJECT_ID IN (SELECT OBJECT_ID FROM sys.objects WHERE type = ‚U‘ AND name = ‚MyTable‘)   Um sie zu ändern: ALTER TABLE MyTable ALTER COLUMN CharCol varchar(10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL  

User für Azure-Datenbank mit eingeschränkten Berechtigungen erstellen

SQL-Server-201233

Bei veröffentlichten Anwendungen, die einen Azure Datenbankzugriff benötigen, möchte man im Verbindungsstring nur ungern das Administrator-Password verraten. Deshalb ist es ratsam, für die Anwendung einen User zu erstellen, der nur die benötigten Rechte hat. Da die Berechtigungen bestimmten Rollen zugeordnet werden, braucht man zuerst eine Rolle: CREATE ROLE MyRole; GO; GRANT SELECT ON dbo.MyTable TO MyRole; GO;   Mögliche Berechtigungen für Tabellen sind: DELETE, INSERT, REFERENCES, SELECT, EXECUTE und UPDATE Jetzt darf die Rolle MyRole in MyTable Selecten. Fehlt noch

Rekursive Funktionen in SQL-Azure

SQL-Server-201233

Für den Fall, das man eine Kategorie-Struktur nach dem Child-Parent Prinzip abfragen möchte bietet sich manchmal eine rekursive Funktion an.       Das folgende Beispiel soll den Aufbau erklären: CREATE TABLE [dbo].[kategorien]( [uid] [bigint] IDENTITY(1,1) NOT NULL, [pid] [bigint] NOT NULL, [Name] [nvarchar](100) NOT NULL, [Tstamp] [datetime] NULL CONSTRAINT [PK_kategorien] PRIMARY KEY CLUSTERED ([uid] ASC) )   im Beispiel ist die „uid“ der Primärschlüssel der Kategorie, pid ist der Fremdschlüssel auf das Elternobjekt. Zum besseren Verständnis sollen einige Datensätze hinzugefügt werden:

Azure-SQL per SELECT einen Wertebereich ermitteln

SQL-Server-201233

Manchmal möchte man per SELECT ermitteln in welchem Wertebereich ein Ergebnis liegt. Angenommen es gibt fogende Bereiche: Bereich A  Werte zwischen 0 und 25, Bereich B Werte zwischen 25 und 50, Bereich C Werte zwischen 50 und 100, Bereich D Werte zwischen 100 und 1000. Dazu erstelle ich folgende Tabelle und fülle per INSERT die Bereiche: CREATE TABLE bereiche( untergrenze int NOT NULL, name NCHAR (1) NOT NULL, id int IDENTITY(1,1) NOT NULL, PRIMARY KEY CLUSTERED (id ASC) ) INSERT

MSSQL NULL Werte in einer Spalte verhindern (mit Standardwert)

SQL-Server-201233

Ungewollte „Null“-Werte, die in einer Tabelle auftauchen sind häufig Ursache von Fehlern. Hier nur kurz die Syntax für die Änderung einer Spalte, so dass einem die kleinen Nullen nicht mehr den Tag versauen.     UPDATE Kunden SET Tage=0 WHERE Tage IS NULL; ALTER TABLE Kunden ALTER COLUMN Tage INT NOT NULL; ALTER TABLE Kunden ADD CONSTRAINT DF_Kunden_Tage DEFAULT 0 FOR Tage;