我使用SQL连接字符串在一起。是什么ISNULL之间的临时表VS ISNULL上原始表的区别?
此语句的工作原理:
DECLARE @FirstNamesString nvarchar(256)
SELECT
@FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName
FROM
Person p
ORDER BY
p.SortOrder
而且我得到第一个名称列表,如:
Name1, Name2, Name3
现在,我想在一个可能为null的姓氏字段中添加对于这些人。我想下面的SQL,但我只得到列表中的最后一个项目(Name3
):
DECLARE @FirstNamesString nvarchar(256)
SELECT @FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName + ISNULL(' ' + p.LastName, '')
FROM
Person p
ORDER BY
p.SortOrder
,但如果我第一次插入所有这些名字到一个临时表,然后一切按预期工作:
CREATE TABLE #Person2
(
FirstName nvarchar(128) NOT NULL
,LastName nvarchar(256) NULL
,SortOrder int NOT NULL
)
INSERT INTO #Person2 (FirstName, LastName, SortOrder) (
SELECT p.FirstName, p.LastName, p.SortOrder FROM Person p)
DECLARE @FirstNamesString nvarchar(256)
SELECT @FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName + ISNULL(' ' + p.LastName, '')
FROM
#Person2 p
ORDER BY
p.SortOrder
DROP TABLE #Person2
那么究竟是什么上述对原始表和对临时表的一个语句之间的区别?该临时表的路由的工作原理,我想用那个,但我很好奇......我缺少什么吗?
更新了可能的解决方案
见@Martin's answer但字符串的连接是不能保证工作。因此,一个解决方案是将姓氏之前,首先选择名字的列表中插入到临时表:
CREATE TABLE #Person2
(
FirstName nvarchar(256) NOT NULL
,SortOrder int NOT NULL
)
INSERT INTO #Person2 (FirstName, SortOrder) (
SELECT p.FirstName + ISNULL(' ' + p.LastName, ''), p.SortOrder
FROM Person p
)
DECLARE @FirstNamesString nvarchar(256)
SELECT
@FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName
FROM
#Person2 p
ORDER BY
p.SortOrder ASC
“p.FirstName”的数据类型是什么?那个单字节意味着计划中有一个额外的'cast'吗? – 2011-03-07 12:42:06
数据类型Person.FirstName的数据类型为nvarchar(128)NOT NULL。 – 2011-03-07 13:45:27