3

姓と名前の後に空白があります。2つのSQLクエリがあります。最初のクエリは、空白なしで検索しても結果を返します。(最初のクエリは不要な結果を返します)。

  1. この動作は、SQL Serverのすべてのバージョンで一貫していますか?
  2. それは既知の動作ですか?どこかに文書化されmsdnていSQL Server 2008 R2ますか?

コード

DECLARE @NameTable TABLE (first_name varchar(40),last_name varchar(40))
INSERT INTO @NameTable VALUES ('STEVEN    ','STANLEY   ');


--QUERY 1
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (first_name = 'STEVEN')
AND (last_name = 'STANLEY')


--QUERY 2       
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (( ISNULL(first_name,'')+' ' +ISNULL(last_name,'') ) = 'STEVEN STANLEY')

--QUERY 3   (With LTRIM and RTRIM)    
SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (( ISNULL(LTRIM(RTRIM(first_name)),'')+' ' +ISNULL(LTRIM(RTRIM(last_name)),'') ) = 'STEVEN STANLEY')

参照

  1. DataLength
  2. SQL Server 2005では、len()とdatalength()の違いは何ですか?
4

2 に答える 2

5

http://support.microsoft.com/kb/316626を参照してください

SQL Serverは、文字列とスペースを比較する方法について、ANSI / ISO SQL-92仕様(セクション8.2、一般規則#3)に従います。ANSI規格では、比較に使用される文字列をパディングして、比較する前に長さが一致するようにする必要があります。パディングは、WHERE句とHAVING句の述語、およびその他のTransact-SQL文字列の比較のセマンティクスに直接影響します。たとえば、Transact-SQLは、文字列「abc」と「abc」をほとんどの比較操作で同等と見なします。

このルールの唯一の例外は、LIKE述語です。LIKE述語式の右側に末尾にスペースがある値が含まれている場合、SQL Serverは、比較が行われる前に2つの値を同じ長さにパディングしません。LIKE述語の目的は、定義上、単純な文字列等価性テストではなくパターン検索を容易にすることであるため、これは前述のANSISQL-92仕様のセクションに違反しません。

これを回避したい場合は、追加条件を追加できます。次のようになります。

参照:DataLength

SELECT first_name AS [FirstName], last_name AS [LastName],first_name+last_name,LEN(first_name+last_name)
FROM  @NameTable A
WHERE (first_name = 'STEVEN') and DATALENGTH(first_name)=DATALENGTH(RTRIM(first_name))
AND (last_name = 'STANLEY') and DATALENGTH(last_name)=DATALENGTH(RTRIM(last_name))
于 2012-12-18T12:51:17.670 に答える
2

ただし、文字列と末尾の空白の比較に関連するものがあるとは言えません--- http://support.microsoft.com/kb/316626

(編集)

このコードを確認できますか?

SELECT first_name AS [FirstName], last_name AS [LastName]
FROM  @NameTable A
WHERE (left(first_name,6) = 'STEVEN')+' '+(right(last_name,6) = 'STANLEY')

(6文字の名前の場合)

于 2012-12-18T12:46:23.043 に答える