Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在同一单元格中插入多个名称(使用逗号分隔)_Sql_Sql Server 2008_Database Design - Fatal编程技术网

Sql 在同一单元格中插入多个名称(使用逗号分隔)

Sql 在同一单元格中插入多个名称(使用逗号分隔),sql,sql-server-2008,database-design,Sql,Sql Server 2008,Database Design,以前,我试图用逗号(见下文)在表格单元格中保留员工的所有姓氏,但我不知道如何保存。然后有人建议使用规范化,我不确定在这种情况下是否更容易。我的老板希望每次编辑员工的账户信息时,都能在网页上显示员工以前的所有姓氏。简言之,当朱迪再次改名时–她的姓金斯利应该插在史密斯的后面。因此,我的问题是,是否可以在同一个单元格中添加多个姓氏,并用逗号分隔,因为我认为在网页上使用变量一次显示所有的别名会更简单?然而,我不知道为它编写代码的复杂性。非常感谢您的帮助 当前SQL表 +---------------+-

以前,我试图用逗号(见下文)在表格单元格中保留员工的所有姓氏,但我不知道如何保存。然后有人建议使用规范化,我不确定在这种情况下是否更容易。我的老板希望每次编辑员工的账户信息时,都能在网页上显示员工以前的所有姓氏。简言之,当朱迪再次改名时–她的姓金斯利应该插在史密斯的后面。因此,我的问题是,是否可以在同一个单元格中添加多个姓氏,并用逗号分隔,因为我认为在网页上使用变量一次显示所有的别名会更简单?然而,我不知道为它编写代码的复杂性。非常感谢您的帮助

当前SQL表

+---------------+-----------------+----------------+--------------------+
     People          FirstName         LastName            Alias
+---------------+-----------------+----------------+--------------------+
     002112            Judy             Smith              Hall
首选

+---------------+-----------------+----------------+--------------------+
     People          FirstName         LastName            Alias
+---------------+-----------------+----------------+--------------------+
     002112            Judy            Kingsley         Hall, Smith

当您为新的姓氏更新表时,请使用以下内容:

UPDATE <table> SET Alias = Alias + ', ' + LastName, LastName = <newLastName>
更新集别名=别名+,'+LastName,LastName=

保持数据库正常化

人民:

(Id, Firstname, Lastname)
LastnameHistory:

(PeopleId, OldLastname, NewLastname, DateChanged)
您可以创建一个属于“”类型的查询的视图,以根据需要转换数据

例如:

DECLARE @people TABLE ( id INT IDENTITY(1,1), fname VARCHAR(50), lname VARCHAR(50))
DECLARE @lnameHistory TABLE ( id INT IDENTITY(1,1), people_id INT, lname VARCHAR(50), date_changed DATETIME)

INSERT INTO @people (fname, lname)
VALUES ('john', 'smith'), ('jane', 'doe')

INSERT INTO @lnameHistory (people_id, lname, date_changed)
VALUES (2, 'shakespeare', '2012-01-01'), (2, 'einstein', '2013-12-12')

;WITH group_concat AS
(
    SELECT people_id, LEFT(lnames , LEN(lnames )-1) AS lnames
    FROM @lnameHistory AS o
    CROSS APPLY
    (
        SELECT lname + ', '
        FROM @lnameHistory AS i
        WHERE o.people_id = i.people_id
        ORDER BY date_changed ASC
        FOR XML PATH('')
    ) pre_trimmed (lnames)
    GROUP BY people_id, lnames
)

SELECT p.*, gc.lnames FROM @people p
JOIN group_concat gc ON gc.people_id = p.id
一些语法参考:


假设您的update语句是一个存储过程,包含@personId和@newLastName的参数:

编辑

抱歉,SQL的版本错误。我得按老办法做

UPDATE PeopleTable
SET Alias = Alias + ', ' + LastName,
    LastName = @newLastName
WHERE
    People = @personId

这只是为了显示,还是你老板想在那个牢房里输入姓名的变更?@TonyHopkinson:主要是为了显示,但她认为如果我把所有的旧姓都放在同一个牢房里会更容易。告诉她不要放弃她的日常工作@我的答案就是你想要的。@TonyHopkinson:你这么说真有趣。她很幸运她雇用了你而不是我。否则,她就不得不面对我这样说,尽管可能要更老练一点。我在存储过程中使用了你的代码,但它不起作用。不确定我是否正确。是否尝试设置别名=别名+,'+LastName,?我刚试过,似乎效果不错。是的,我试过了。在我执行它并返回测试我的网页之后,它没有在别名列中插入以前的姓氏。谢谢。当她的老板要找我的时候,找到那个以前姓这个的员工?还有我的,他的,我的呢?部分重复“Hopkinson,Hopkins,Hopkin”@BWS:这就是我的存储过程的样子:
UPDATE People SET Alias=Alias+,“+LastName,LastName=@LastName WHERE CAST(PeopleID AS Varchar(25))=@PeopleID
@TonyHopkinson:你说得对。没有办法强制执行唯一性,但这正是我老板想要的(我阅读了您提供的网页,其中有很多很好的信息,但我不熟悉GROUP_CONCAT中的语法。也许这太难问了。您能否演示如何使用GROUP_CONCAT创建视图?