在t sql中是否包含StartsWith或包含变量的变量?


94

我正在尝试检测服务器是否正在运行Express Edition。

我有以下的T SQL。

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

print @edition

以我为例 @edition = Express Edition (64-bit)

我该怎么办?(受C#启发)。

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

Answers:


122

以。。开始

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

包含

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

例子

left 功能

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

iif 函数(从SQL Server 2012开始)

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

charindex 功能

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

1
请注意,在内部,这些方法的工作方式不同,尤其是wrt性能及其对索引的使用。例如,查询中使用 colName LIKE 'prefix%'会在非常快的colName被索引,但colName LIKE '%substring%'还是colName LIKE '%suffix'会很慢,因为索引文本时,SQL Server不会创建后缀树。同样,LEFT与列一起使用也会很慢,因为这些查询不可SARGable。SARGability是很重要的:dba.stackexchange.com/questions/162263/...

我建议测试下面提到的LIKE'x%'方法。在某些情况下,它要快得多
Tony Sepia

72

似乎您想要的是http://msdn.microsoft.com/zh-cn/library/ms186323.aspx

在您的示例中,它将是(开始于):

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

或包含

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

为什么不使用LIKE Express Edition%?另外,您的解决方案是否在字符串的任何地方都返回“ Express Edition”的真值?因此,更具体地说,它只是一种“包含”的方式
Don Cheadle

3
@mmcrae虽然使用以下类似版本会很好,但这是我想到的第一种方式,并且看起来最像OP的方式。同样,仅当变量以给定参数开头(charindex返回1)时,第一个表达式才返回true。第二个表达式是个contains,因为如果在字符串中的任何位置找到参数(charindex返回1或更大),它将返回true。
Gary.S

45

我会用

like 'Express Edition%'

例:

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

如果您阅读了该问题,则它不是查询。尝试用我的示例回答您的答案,然后更新您的答案以表明其有效。
Valamas 2015年

您可以在t-sql的if语句中使用like。这就是为什么我使用like。我不明白为什么要为此给我减分,但为什么不呢。
Thomas Koelle

9
这应该是首选方式;它更优雅,更简洁且“ SQL对齐”:由于它使用标准的SQL LIKE运算符,因此我无需阅读文档即可理解它!
加西亚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.