以下是一个示例表:
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');
我有两个不同的数据库,其中一个是2012年,另一个是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
这不起作用:
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 :(得分:4)
您需要初始化Declare @sql NVARCHAR(MAX)=''
原因:默认情况下没有初始化它将为null,concat会将null作为空字符串处理,其中作为手动连接+我们需要处理空值。
更改它的第一行
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 :(得分:2)
+
和CONCAT
之间的区别?
从我的观点来看,+
和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`