我使用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