Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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 server 什么';“这是一种优雅而有效的方式”;“移动”;将行值添加到末尾,并使用;“移位”;其他人留在SQL Server中了吗?_Sql Server - Fatal编程技术网

Sql server 什么';“这是一种优雅而有效的方式”;“移动”;将行值添加到末尾,并使用;“移位”;其他人留在SQL Server中了吗?

Sql server 什么';“这是一种优雅而有效的方式”;“移动”;将行值添加到末尾,并使用;“移位”;其他人留在SQL Server中了吗?,sql-server,Sql Server,我需要创建一个instead of触发器,在insert的特定情况下,该触发器将“移动”一行值“Type”到末尾,并在其他行值向右移动时向左“移位”以进行补偿 原文插入: +----------+-----+------------+------------+---------+------------+---------+ | Name | Job | Date | Salary | Age | Department | Type | +-------

我需要创建一个instead of触发器,在insert的特定情况下,该触发器将“移动”一行值“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