我的同事和我在SQL-Server中遇到了一個奇怪的行爲。爲什麼一個案例中的一個場景的內容決定是否應該修剪其他內容?
考慮下面的代碼:
select a =
case when 1=1 then
'a '
else
'b '
end + 'c'
人們會應該合理假設以上代碼生成字符串「爲C」。它確實如此。
但是,如果我延長else
的常數(「B「)與額外的空間,一些奇怪的事情發生了:
select a =
case when 1=1 then
'a '
else
'b '
end + 'c'
現在的結果是‘交流’,從空間‘’具有消失了。反過來也是如此:
select a =
case when 1=0 then
'a '
else
'b '
end + 'c'
這將產生'bc'。所以當常量不被返回的時間比被返回的常量長時,被返回的常量被修剪。
而且它只是一個正確的修剪,因爲下面的代碼將產生「交流」:
select a =
case when 1=1 then
' a '
else
'b '
end + 'c'
是有此行爲的原因是什麼?我認爲它可能與清理字符串尾部空白有關,但爲什麼只有當常量不被返回時纔會發生?
在SQL Server 2014 Express Edition上觀察到上述行爲。
更新:
正如評論所說,這種行爲不會出現要在SQL Server的標準安裝可重複2014年
我無法重現問題 –
SQL-Server的版本和發行版可以在SQLFiddle上重現嗎? – MatBailie
好奇,也許它與我的查詢執行設置有關。目前,我只設置了「SET ARITHABORT」標誌並且沒有ANSI標誌。我正在使用SQL Server 2014.而且我無法在SQLFiddle上重現該行爲。這一定與我們的設置有關。我不知道是什麼設置導致它。 – Svip