SQL Server 2012。将行复制到另一个表的单个列中
我正在AdventureWorks2012数据库上使用SQL Server。我正在使用触发器。我想将任何新插入的行复制到另一个名为AuditTable的表中的一列中。基本上,每当我插入parson.address表时,我都希望将所有行复制到AuditTable.prevValue列中。我知道如何插入等,我不知道如何写一列 这里是总体思路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]
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时转换失败”。非常感谢。