Sql server 什么';“这是一种优雅而有效的方式”;“移动”;将行值添加到末尾,并使用;“移位”;其他人留在SQL Server中了吗?
我需要创建一个instead of触发器,在insert的特定情况下,该触发器将“移动”一行值“Type”到末尾,并在其他行值向右移动时向左“移位”以进行补偿 原文插入:Sql server 什么';“这是一种优雅而有效的方式”;“移动”;将行值添加到末尾,并使用;“移位”;其他人留在SQL Server中了吗?,sql-server,Sql Server,我需要创建一个instead of触发器,在insert的特定情况下,该触发器将“移动”一行值“Type”到末尾,并在其他行值向右移动时向左“移位”以进行补偿 原文插入: +----------+-----+------------+------------+---------+------------+---------+ | Name | Job | Date | Salary | Age | Department | Type | +-------
+----------+-----+------------+------------+---------+------------+---------+
| Name | Job | Date | Salary | Age | Department | Type |
+----------+-----+------------+------------+---------+------------+---------+
| John Doe | 4 | Accountant | 20-07-2014 | 1000.54 | 25 | Defense |
+----------+-----+------------+------------+---------+------------+---------+
期望输出:
+----------+------------+------------+---------+-----+------------+------+
| Name | Job | Date | Salary | Age | Department | Type |
+----------+------------+------------+---------+-----+------------+------+
| John Doe | Accountant | 20-07-2014 | 1000.54 | 25 | Defense | 4 |
+----------+------------+------------+---------+-----+------------+------+
这假设列都是可互换的数据类型。我使用NVARCHAR(10)使示例工作。您必须根据预期数据对此进行调整。您可以在许多情况下使用,但我不确定插入的数据类型或列的数据类型,因此我无法进一步建议您将转换函数精确放置在何处
一个例子可能是
CONVERT(DATETIME, Salary, 103)
这会让你的触发器看起来像这样:
CREATE TRIGGER ReorderTrigger ON TableName INSTEAD OF INSERT
AS
INSERT TableName (Name, Job, Date, Salary, Age, Department, Type)
SELECT Name, [Date], CONVERT(DATETIME, Salary, 103), Age, Department,[Type],
Job
FROM inserted
您可以研究触发器在上的工作方式,并且您不必在表中移动列,这不是Excel,而是将行值从一列移动到另一列。在表格中进行排列是一个非常糟糕的主意,它会在所有可能的方面影响你的表现。你为什么要这样做?表中的字段应该包含具有特定业务含义的特定类型、约束的值。“移动”它们就好像这是Excel一样,意味着将不相关的值放在不相关的字段中,而这些字段甚至可能不接受它们。是否允许采用表结构?就SQL Server而言,
C
并非如此,因此您必须明确指定要为哪些列分配哪些值(SET C=inserted.D,D=inserted.E,…
),这很快就会变得笨拙,尤其是在必须允许所有可能的组合的情况下,但SQL更喜欢它的静态类型。您可能想通过将列转换为行来不同地表示数据,这使得这一操作变得简单得多。您没有早点发布吗?你为什么要删除之前的问题,然后再发布一个完全相同的问题?我无法访问以前的评论,但我的上一点仍然是INSERT-INTO t(Col1,Col2)值(1,2)代码>和插入T(Col2,Col1)值(2,1)代码>完全相同。@AntonioCraveiro这不是一个有效的理由。您可以选择任何查询返回的列。只是不要选择你不想要的列。如果您使用的工具无法使用源查询或无法选择特定列(确定吗?),请创建仅包含所需字段的视图。
CREATE TRIGGER ReorderTrigger ON TableName INSTEAD OF INSERT
AS
INSERT TableName (Name, Job, Date, Salary, Age, Department, Type)
SELECT Name, [Date], CONVERT(DATETIME, Salary, 103), Age, Department,[Type],
Job
FROM inserted