2012-05-09 66 views
1

我有以下代碼,它在上一條語句中與"@B LIKE @A"比較返回false。與sql server中的LIKE運算符比較,VARCHAR文本不等於Char文本

我想知道爲什麼Like是這樣做的,因爲根據我的知識,就像基於文本的比較不基於數據類型一樣。

DECLARE @Var1 Char(20) 
DECLARE @Var2 VarChar(20) 

SET @Var1 = 'X' 
SET @Var2 = 'X' 

SELECT 
@Var1 AS A, 
@Var2 AS B, 
LEN(@Var1) AS 'A Length', 
LEN(@Var2) AS 'B Length', 
CASE WHEN @Var1 = @Var2 THEN 'Yes' ELSE 'No' END AS 'A = B', 
CASE WHEN @Var1 LIKE @Var2 THEN 'Yes' ELSE 'No' END AS 'A LIKE B', 
CASE WHEN @Var2 LIKE @Var1 THEN 'Yes' ELSE 'No' END AS 'B LIKE A' 
+1

你讀過的[文件]中的備註部分(http://msdn.microsoft.com/en-us/library/ms179859.aspx) ? – GSerg

+0

是的,我已閱讀,但它並沒有完全澄清的事情。 –

+0

在SQL Server中它們是不同的。在Sybase ASE中,它們是Equal:P –

回答

1

@A是類型CHAR(20)的,因此它的值是在用空格右側填充到填寫它到的20

的長度Len()函數排除了尾隨空格,因此@A和@B都顯示長度爲1,儘管@A已用空格填充。

爲了進行比較,SQL Server遵循ansi標準,在比較之前需要將字符串填充到相同長度,所以@A和@B顯示爲相等。

對此的一個例外是LIKE謂詞,如果尾部空格在右側,則不會將字符串填充到相同的長度。

Ref: How SQL Server Compares Strings with Trailing Spaces

2

的CHAR值包含尾隨空格,即使你沒有看到他們和LEN()不報告它們。

嘗試使用此方法驗證:

DECLARE @Var1A Char(40) 
DECLARE @Var2A VarChar(40) 

SELECT @Var1A = @Var1 + 'x', @Var2A = @Var2 + 'x' 

SELECT LEN(@Var1A), LEN(@Var2A), '"' + @Var1A + '"', '"' + @Var2A + '"' 

21 2 "X     x     " "Xx" 
0

檢查了這一點

DECLARE @Var1 Char(20) 
DECLARE @Var2 VarChar(20) 
SET @Var1 = 'X' 
SET @Var2 = 'X' 
    SELECT 
    @Var1 AS A, 
    @Var2 AS B, 
    LEN(@Var1) AS 'A Length', 
    LEN(@Var2) AS 'B Length', 
    DataLength(@Var1) AS 'A DataLength', 
    DataLength(@Var2) AS 'B DataLength', 
    CASE WHEN @Var1 = @Var2 THEN 'Yes' ELSE 'No' END AS 'A = B', 
    CASE WHEN ltrim(rtrim(@Var1)) LIKE ltrim(rtrim(@Var2)) THEN 'Yes' ELSE 'No' END AS 'A LIKE B', 
    CASE WHEN ltrim(rtrim(@Var2)) LIKE ltrim(rtrim(@Var1)) THEN 'Yes' ELSE 'No' END AS 'B LIKE A'