Tag: "query"

Dynamische Suchbedingungen in T-SQL

Posted on Jul 13, 2004 von in SQL Server

Original von Erland Sommarskog; deutsche Übersetzung von Frank Kalis

Einführung

Eine sehr weitverbreitete Anforderung an ein Informationssystem ist es, eine oder mehrere Funktionen zu haben, bei denen der Benutzer in der Lage ist, die Daten durch freie Auswahl möglichst vieler verschiedener Kriterien zu durchsuchen. Dies ist eine enorme Herausforderung, da Sie nicht nur den gewünschten Output produzieren müssen, sondern auch die Antwortzeiten innerhalb eines akzeptablen Zeitrahmens halten müssen, zumindest bei häufig verwendeten Suchen. Zu guter Letzt muss der Code leicht zu warten sein, damit neue Wünsche und Anforderungen leicht implementiert werden können.

Ganze Geschichte »

Nicht-alphanumerische Zeichen finden

Posted on Jul 13, 2004 von in SQL Server
SET NOCOUNT ON
CREATE TABLE strip_t
(
col VARCHAR(30)
)
INSERT INTO strip_t VALUES ('Frank')
INSERT INTO strip_t VALUES ('Frank!')
INSERT INTO strip_t VALUES ('Fr^ank')
INSERT INTO strip_t VALUES ('Fran&k')
INSERT INTO strip_t VALUES ('Fran$k')
SET NOCOUNT OFF
SELECT
*
FROM
strip_t
WHERE
col
LIKE '%[^A-Za-z0-9]%'

col
------------------------------
Frank!
Fr^ank
Fran&k
Fran$k

(4 row(s) affected)

Als Gegenprobe:

SELECT 
*
FROM
strip_t
WHERE
col
NOT LIKE '%[^A-Za-z0-9]%'

GO
DROP TABLE strip_t

col
------------------------------
Frank

(1 row(s) affected)

Einen Nachteil gibt es doch: Dies funktioniert nicht mit allen Collations. Also, unbedingt gründlich vorher testen!!!

Laufende Summe in T-SQL

Posted on Jul 13, 2004 von in SQL Server
IF OBJECT_ID('lfdsum_t') IS NOT NULL
     DROP TABLE lfdsum_t
GO
CREATE TABLE lfdsum_t (col1 int)
INSERT INTO lfdsum_t values (1);
INSERT INTO lfdsum_t values (2);
INSERT INTO lfdsum_t values (3);
INSERT INTO lfdsum_t values (4);
INSERT INTO lfdsum_t values (5);

SELECT 
     a.COL1
     ,(SELECT 
          Sum(b.col1)
     FROM
          lfdsum_t b
WHERE 
          b.col1 <= a.col1) lfd_Sum
FROM 
     lfdsum_t a
DROP TABLE lfdsum_t

COL1        lfd_Sum     
----------- ----------- 
1           1
2           3
3           6
4           10
5           15

(5 row(s) affected)

Zugegebenermassen bin ich mir nicht sicher, ob der technische Begriff dafür 'laufende Summe' ist. Für Anregungen zu einem treffenderen Begriff bin ich dankbar.

Wofür ist xp_servicecontrol?

Posted on Jul 13, 2004 von in SQL Server

xp_servicecontrol ist eine undokumentierte erweiterte Prozedur, die zur Kontrolle von Diensten auf der SQL Server Maschine eingesetzt werden kann.

Ganze Geschichte »

Umwandeln von Hexadezimal nach Integer

Posted on Jul 13, 2004 von in SQL Server
SET NOCOUNT ON
DECLARE @hex VARCHAR(10)
DECLARE @stmt NVARCHAR(255)
DECLARE @int INT 
SET @hex = '0x0000008A' 
SELECT @stmt = N'SELECT @int = CONVERT( int , ' + @hex + ' )' 
EXEC sp_ExecuteSql @stmt, N' @int Int Out', @int OUT SELECT @int GO
GO

GO          
----------- 
138

Ganze Geschichte »

Unterschied zwischen DELETE und TRUNCATE

Posted on Jul 13, 2004 von in SQL Server

DELETE logged die Daten für jede einzelne Zeile, die von dem Statement betroffen sind und entfernt physikalisch den Record aus der Seite. Fährt man seine Datenbanken im "Full Recovery" Modus, kann die Aufzeichnung eines jeden einzelnen betroffenen Datensatzes das Transaktionsprotokoll enorm aufblähen. Dies ist aber notwendig, damit SQL Server im Falle einen Falles die Datenbank so aktuell wie möglich wiederherstellen kann. Der Umstand, das jeder Datensatz protokolliert wird, macht auch verständlich, daß umfangreiche DELETE Operationen langsam sind.

Ganze Geschichte »

Unterschiede zwischen DECIMAL und NUMERIC

Posted on Jul 13, 2004 von in SQL Server

Der Unterschied zwischen beiden Datentypen ist mehr als subtil im SQL 92 Standard.

Ganze Geschichte »

Das Alter einer Person

Posted on Jul 13, 2004 von in SQL Server
DECLARE @d DATETIME
SET @d = '23.07.1968'
SELECT
     DATEDIFF(yyyy,CAST(@d AS DATETIME),GETDATE()) 
     - 
     (CASE WHEN DATEADD(yyyy,DATEDIFF(yyyy,CAST(@d AS DATETIME),GETDATE()),CAST(@d AS DATETIME)) > 
     GETDATE() THEN 1 ELSE 0 END)

            
----------- 
35

(1 row(s) affected)