+和CONCAT的区别?
下面是一个例子表:+和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');
我有2个不同的数据块,其中之一是2012年,2008年等SO,我必须总是使这两个工作的代码处理。我有一个工作的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
此,不工作:
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。)
需要初始化声明@sql NVARCHAR(MAX)=“”
原因:默认情况下,如果没有初始化这将是空,concat会将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
谢谢!我还添加了一个where子句,使其对可能在实际表中的NULL值进行强化(感谢@xQbert)。 – lukehawk
区别?
从我的观点来看,+
和CONCAT
函数之间的两个主要区别是:
[1]当串联NULL
,CONCAT
将取代NULL
与空字符串和最终结果将是NOT NULL
:
SELECT CONCAT('a', NULL, 'b') -- generates 'ab'
同时使用
+
会产生
NULL
或什么别的拼接根据
CONCAT_NULL_YIELDS_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]当连接具有数字的字符串(例如),因为data type precedence它使用+
而CONCAT
会自动时极有可能得到一个错误/异常。转换为字符串([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`
如果你写出来sp_execute @ SQL变量之前@SQL
这是什么节目?如果你试图运行它返回结果呢? – xQbert
@xQbert - 我不知道你的意思。 – lukehawk
@WorkSmarter - 对不起,这是我抓住吸管。删除这些不会做任何事情。 – lukehawk