Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 2012。将行复制到另一个表的单个列中_Sql_Triggers_Insert_Sql Server 2012 - Fatal编程技术网

SQL Server 2012。将行复制到另一个表的单个列中

SQL Server 2012。将行复制到另一个表的单个列中,sql,triggers,insert,sql-server-2012,Sql,Triggers,Insert,Sql Server 2012,我正在AdventureWorks2012数据库上使用SQL Server。我正在使用触发器。我想将任何新插入的行复制到另一个名为AuditTable的表中的一列中。基本上,每当我插入parson.address表时,我都希望将所有行复制到AuditTable.prevValue列中。我知道如何插入等,我不知道如何写一列 这里是总体思路 USE [AdventureWorks2012] ALTER TRIGGER [Person].[sPerson] ON [Person].[Address]

我正在AdventureWorks2012数据库上使用SQL Server。我正在使用触发器。我想将任何新插入的行复制到另一个名为AuditTable的表中的一列中。基本上,每当我插入parson.address表时,我都希望将所有行复制到AuditTable.prevValue列中。我知道如何插入等,我不知道如何写一列

这里是总体思路

USE [AdventureWorks2012]

ALTER TRIGGER [Person].[sPerson] ON [Person].[Address]


 FOR INSERT AS INSERT INTO AdventureWorks2012.HumanResources.AuditTable(PrevValue) select 
 AddressID,AddressLine1,AddressLine2,City, StateProvinceID, PostalCode, SpatialLocation, rowguid, ModifiedDate FROM Inserted
错误:INSERT语句的select列表包含的项目多于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配


谢谢你的帮助。我已经搜索了加载,但在任何地方都找不到确切的解决方案。

错误消息说明了一切-您不能在单个列中插入9列不同类型的列。假设您的目标
AuditTable.PrevValue
列是
NVARCHAR()
,您可以通过连接列并将非字符列强制转换为n*char来按如下方式展平插入:

 INSERT INTO AdventureWorks2012.HumanResources.AuditTable(PrevValue) 
 SELECT 
    N'ID : ' + CAST(AddressID AS NVARCHAR(20)) + N'Address: ' + AddressLine1 + 
    N', ' +AddressLine2 + ....
 FROM Inserted
iMo保持这样一个长字符串使得审计表难以查找,因此您可以考虑添加<代码>源代码< /代码>和可能<代码>源PK/<代码>列。

您还可以考虑将行转换为XML并将其存储为XML列,如:

create table Audit
(
     AuditXml xml
);

alter trigger [Person].[sPerson] ON [Person].[Address] for INSERT AS
begin
    DECLARE @xml XML;
    SET @xml =  
    (
      SELECT *
      FROM INSERTED
      FOR XML PATH('Inserted')
    );
    insert into [MyAuditTable](AuditXml) VALUES (@xml);
end

2.这是我已经完成的。对于INSERT AS INSERT INTO AdventureWorks2012.HumanResources.AuditTable(PrevValue)选择N'ID:'+CAST(AddressID为NVARCHAR(20))+N'Address:'+AddressLine1+N','+AddressLine2+City+CAST(StateProvinceID为NVARCHAR(20))+CAST(PostalCode为NVARCHAR(20))+CAST(空间分配为NVARCHAR(200))+CAST(rowguid为NVARCHAR(100))+从“插入”中转换(修改为NVARCHAR(40))。我认为这应该是正确的,但其中一列的类型是geography。我将表设置为nvarchar(300),并已将所有表转换为char,但我遇到的问题是“从字符串转换为uniqueidentifier时转换失败”。非常感谢。