Gibt es StartsWith oder Contains in t sql mit Variablen?

94

Ich versuche festzustellen, ob auf dem Server Express Edition ausgeführt wird.

Ich habe die folgenden t sql.

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

print @edition

In meinem Fall @edition = Express Edition (64-bit)

Wie kann ich Folgendes tun? (C # inspiriert).

DECLARE @isExpress bit;
set @isExpress = @edition.StartsWith('Express Edition');
Valamas
quelle

Antworten:

122

Beginnt mit

a) left(@edition, 15) = 'Express Edition'
b) charindex('Express Edition', @edition) = 1

Enthält

charindex('Express Edition', @edition) >= 1

Beispiele

left Funktion

set @isExpress = case when left(@edition, 15) = 'Express Edition' then 1 else 0 end

iif Funktion (ab SQL Server 2012)

set @isExpress = iif(left(@edition, 15) = 'Express Edition', 1, 0);

charindex Funktion

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
Kirill Polishchuk
quelle
1
Beachten Sie, dass diese intern unterschiedlich funktionieren, insbesondere hinsichtlich der Leistung und der Verwendung von Indizes. Zum Beispiel kann eine Abfrage colName LIKE 'prefix%'sehr schnell sein wird , wenn colNameindiziert ist, aber colName LIKE '%substring%'oder colName LIKE '%suffix'wird langsam sein , da SQL Server nicht Suffix-Bäume erstellen , wenn Textindizierung. In ähnlicher Weise ist die Verwendung LEFTmit einer Spalte auch langsam, da diese Abfragen nicht SARG-fähig sind. SARGability ist wichtig: dba.stackexchange.com/questions/162263/…
Dai
Ich würde empfehlen, die unten erwähnte LIKE-Methode 'x%' zu testen. In einigen Fällen ist es viel schneller
Tony Sepia
72

Anscheinend möchten Sie http://msdn.microsoft.com/en-us/library/ms186323.aspx .

In Ihrem Beispiel wäre es (beginnt mit):

set @isExpress = (CharIndex('Express Edition', @edition) = 1)

Oder enthält

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
Gary.S
quelle
Warum nicht LIKE verwenden Express Edition%? Gibt Ihre Lösung nicht "true" zurück, wenn sich "Express Edition" irgendwo in der Zeichenfolge befindet? Es ist also genauer gesagt nur eine "Enthält" -Methode
Don Cheadle,
3
@mmcrae Während die Verwendung der folgenden ähnlichen Version in Ordnung wäre, war dies der erste Weg, der mir in den Sinn kam und am ehesten dem entspricht, was das OP hatte. Außerdem gibt der erste Ausdruck nur dann true zurück, wenn die Variable mit dem angegebenen Argument beginnt (charindex gibt 1 zurück). Der zweite Ausdruck ist ein enthält, da er true zurückgibt, wenn das Argument an einer beliebigen Stelle in der Zeichenfolge gefunden wird (charindex gibt 1 oder mehr zurück).
Gary.S
45

ich würde ... benutzen

like 'Express Edition%'

Beispiel:

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

DECLARE @isExpress bit
if @edition like 'Express Edition%'
    set @isExpress = 1;
else
    set @isExpress = 0;

print @isExpress
Thomas Koelle
quelle
Wenn Sie die Frage lesen, handelt es sich nicht um eine Abfrage. Versuchen Sie mein Beispiel mit Ihrer Antwort und aktualisieren Sie dann bitte Ihre Antwort, um zu zeigen, dass sie funktioniert.
Valamas
Sie können wie in if-Anweisungen in t-sql verwenden. Deshalb benutze ich gerne. Ich verstehe nicht, warum du mir dafür Minuspunkte geben willst, aber warum nicht.
Thomas Koelle
9
Dies sollte der bevorzugte Weg sein; Es ist eleganter, weniger ausführlich und "SQL-ausgerichtet": Da es den Standard-SQL-LIKE-Operator verwendet, sollte ich die Dokumentation nicht lesen müssen, um es zu verstehen!
Fer García