¿Hay StartsWith o Contiene en t sql con variables?

94

Estoy tratando de detectar si el servidor está ejecutando Express Edition.

Tengo el siguiente t sql.

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

print @edition

En mi caso @edition = Express Edition (64-bit)

¿Cómo puedo hacer lo siguiente? (C # inspirado).

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

Respuestas:

122

Comienza con

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

Contiene

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

Ejemplos

left función

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

iif función (comenzando con SQL Server 2012)

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

charindex función

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);
Kirill Polishchuk
fuente
1
Tenga en cuenta que internamente estos funcionan de manera diferente, especialmente el rendimiento de wrt y su uso de índices. Por ejemplo, el uso de una consulta colName LIKE 'prefix%'será muy rápido cuando colNamese indexa, pero colName LIKE '%substring%'o colName LIKE '%suffix'será lento porque SQL Server no crea árboles de sufijos al indexar texto. De manera similar, el uso LEFTcon una columna también será lento porque esas consultas no se pueden realizar en SARG. SARGability es importante: dba.stackexchange.com/questions/162263/…
Dai
Recomendaría probar el método LIKE 'x%' mencionado a continuación. En algunos casos es mucho más rápido
Tony Sepia
72

Parece que lo que quieres es http://msdn.microsoft.com/en-us/library/ms186323.aspx .

En su ejemplo sería (comienza con):

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

O contiene

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)
Gary.S
fuente
¿Por qué no usar LIKE Express Edition%? Además, ¿su solución no devuelve verdadero si "Express Edition" está en cualquier lugar de la cadena? Así que es más específicamente una forma de "Contiene" de hacerlo
Don Cheadle
3
@mmcrae Si bien usar la versión similar a continuación estaría bien, esta fue la primera forma que me vino a la mente y se parece más a lo que tenía el OP. Además, la primera expresión solo devolverá verdadero si la variable comienza con (charindex devuelve 1) el argumento dado. La segunda expresión es contiene, ya que devolverá verdadero si el argumento se encuentra en cualquier lugar de la cadena (charindex devuelve 1 o más).
Gary.S
45

yo usaría

like 'Express Edition%'

Ejemplo:

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
fuente
Si lee la pregunta, no es una consulta. Pruebe mi ejemplo con su respuesta y luego actualice su respuesta para mostrar que funciona.
Valamas
Puede usar como en sentencias if en t-sql. Por eso utilizo like. No veo por qué quieres darme puntos negativos por eso, pero por qué no.
Thomas Koelle
9
Esta debería ser la forma preferida; es más elegante, menos detallado y "alineado con SQL": ya que utiliza el operador estándar SQL LIKE, ¡no debería necesitar leer la documentación para comprenderlo!
Fer García