2017-08-04 12 views
1

は、たとえばテーブルです:+とCONCATの違いは?ここで

CREATE TABLE Example 
(
    LastName varchar(255), 
    FirstName varchar(255), 
    HomeAddress varchar(255), 
    City varchar(255) 
); 

INSERT INTO Example VALUES ('Murphy', 'James','123 Easy St', 'New York'); 
INSERT INTO Example VALUES ('Black', 'John','345 Youfarted St', 'Boston'); 
INSERT INTO Example VALUES ('Black', 'Amy','123 Simple St', 'Chicago'); 
INSERT INTO Example VALUES ('Simpson', 'Bill','123 Whofarted St', 'New York'); 
INSERT INTO Example VALUES ('Jones', 'James','321 Foo St', 'Chicago'); 
INSERT INTO Example VALUES ('Black', 'John','275 Ipsum St', 'Boston'); 
INSERT INTO Example VALUES ('Murphy', 'Sean','983 Ifarted St', 'New York'); 

私はSO 2つの異なるDBを、2012年での1、他の2008年を持って、私はいつもの両方で動作するコードを作るに対処する必要があります。私は働いている2012年のクエリ(CONCAT()を使用)がありますが、2008年に同じクエリを '+'で使用しようとすると何も印刷されません。

これは動作します:

(私が欲しいものである)、これを生産する
DECLARE @sql2 NVARCHAR(max) 

SELECT 
    @sql2 = CONCAT(@sql2, ', COUNT(CASE WHEN city = ''', City, ''' THEN 1 END) as ', QUOTENAME(City)) 
FROM 
    Example 
GROUP BY City 

SET @sql2 = CONCAT('SELECT LastName', @sql2, ' FROM example GROUP BY LastName') 

EXEC sp_executesql @sql2 

を:

LastName Boston Chicago New York 
Black   2  0  0 
Jones   0  2  0 
Murphy   0  0  2 
Simpson   0  0  1 

THIS、動作しません:

DECLARE @sql NVARCHAR(max) 

SELECT 
    @sql = @sql + ', COUNT(CASE WHEN city = ''' + City + ''' THEN 1 END) as ' + QUOTENAME(City) 
FROM 
    Example 
GROUP BY City 

SET @sql = 'SELECT LastName' + @sql + ' FROM example GROUP BY LastName' 

EXEC sp_executesql @sql 

動作しません」で'、私はそれが結果を印刷しないことを意味します。私が戻ってくるのは、Command(s) completed successfully.

です。

OH!このクエリの範囲内で作業してください。私はこの猫に皮膚をつける他の方法があることを知っていますが、これは私が選択した方法です。 (私はそれが動的にする必要がある、と私はそれがPIVOTを使用しないようにする必要があります。)

+0

あなたは、SQL変数@ sp_execute前@SQLを書き出す場合、それは何を示していますか?それを実行しようとすると結果が返されますか? – xQbert

+0

@xQbert - あなたは何を意味するのか分かりません。 – lukehawk

+0

@WorkSmarter - 申し訳ありませんが、私はストローで掴んでいました。それらを削除することは何もしません。 – lukehawk

答えて

4

あなたは@sql NVARCHAR(MAX)=「」

理由宣言し初期化する必要があります。デフォルトで初期化しないと、それはnullになりますが、concatは空の文字列としてnullを処理します。+手動でnull値を処理する必要があります。

あなたの最初の行を変更

それが+CONCAT


DECLARE @sql NVARCHAR(max) = '' --Initialize with empty string 

SELECT 
    @sql = @sql + ', COUNT(CASE WHEN city = ''' + City + ''' THEN 1 END) as ' + QUOTENAME(City) 
FROM 
    Example 
GROUP BY City 

SET @sql = 'SELECT LastName' + @sql + ' FROM example GROUP BY LastName' 

EXEC sp_executesql @sql 
+1

ありがとう!!また、where句を追加して、実際のテーブルにある可能性のあるNULL値に対して堅牢にしました(@xQbertのおかげで)。 – lukehawk

2

違いが働くのだろうか?

私の視点から、+CONCAT機能との間の主な2つの違いは、次のとおり

NULLを連結する場合、[1]、CONCATは、空の文字列でNULLを交換し、最終結果はNOT NULLあろう。

SELECT CONCAT('a', NULL, 'b') -- generates 'ab' 

+を使用して連結はCONCAT_NULL_YIELDS_NULLに応じて、NULLまたは何か他のものを生成する一方設定:

SET CONCAT_NULL_YIELDS_NULL ON -- Recommended setting 
SELECT 'a' + NULL + 'b' --> NULL 

または

SET CONCAT_NULL_YIELDS_NULL OFF 
SELECT 'a' + NULL + 'b' --> `ab` 

[2]数字と文字列を連結する場合(例えば)意志 +しばらく CONCAT自動車を使用している場合、それはエラー/例外を取得する可能性が高いですので data type precedenceの。文字列( [N]VARCHAR)に変換:

SELECT 'a' + 'b' + 123 -- End result: exception because `INT (123)` has a higher precedence than `VARCHAR(ab)` -> SQL Server will try to convert "everthing" to `INT` -> exception because 'ab' can't be converted to INTs 
----------- 
Msg 245, Level 16, State 1, Line 7 
Conversion failed when converting the varchar value 'ab' to data type int. 

SELECT CONCAT('a', 'b', 123) --> `ab123` 
関連する問題