【问题标题】:SQL Server 2012. Copy row into single column on another tableSQL Server 2012。将行复制到另一个表的单列中
【发布时间】:2014-01-06 10:25:12
【问题描述】:

我正在 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 列的数量相匹配。

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

【问题讨论】:

    标签: sql triggers insert sql-server-2012


    【解决方案1】:

    错误消息说明了一切 - 您不能将 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 像这样保留一个长字符串会使 Audit 表难以搜索,因此您可以考虑添加 SourceTable 和可能的 Source 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.这是我已经完成的。 FOR INSERT AS INSERT INTO AdventureWorks2012.HumanResources.AuditTable(PrevValue) SELECT N'ID : ' + CAST(AddressID AS NVARCHAR(20)) + N'Address: ' + AddressLine1 + N', ' +AddressLine2 + City + CAST(StateProvinceID AS NVARCHAR(20)) + CAST(PostalCode AS NVARCHAR(20))+ CAST(SpatialLocation AS NVARCHAR(200)) + CAST(rowguid AS NVARCHAR(100))+ CAST (ModifiedDate AS NVARCHAR(40)) 从插入。我认为这应该是正确的,但其中一列是地理类型。
    • 我将表设置为 nvarchar(300) 并将所有转换为 char,但我遇到的问题是“从字符串转换为唯一标识符时转换失败。”非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多