2014-01-06 54 views
0

我正在使用AdventureWorks2012數據庫上的SQL Server。我正在使用觸發器。我想將任何新插入的行復制到名爲AuditTable的另一個表中的單個列中。基本上,無論何時插入到parson.address表中,我都想將所有行復制到AuditTable.prevValue列中。我知道如何插入等,我不知道如何寫入一列。SQL Server 2012.將行復制到另一個表上的單列中

這是一般的想法。

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 

ERROR: The select list for the INSERT statement contains more items than the insert list. The number of SELECT values must match the number of INSERT columns.

謝謝你的任何援助。我搜索了負載,但無法在任何地方找到確切的解決方案。

回答

2

錯誤消息說明了這一切 - 不能將9列不同類型的數據插入到單個列中。假設您的目的地AuditTable.PrevValueNVARCHAR(),你可以扁平化您的插入如下,通過連接柱和鑄造非字符列到n *字符:

INSERT INTO AdventureWorks2012.HumanResources.AuditTable(PrevValue) 
SELECT 
    N'ID : ' + CAST(AddressID AS NVARCHAR(20)) + N'Address: ' + AddressLine1 + 
    N', ' +AddressLine2 + .... 
FROM Inserted 

IMO保持一個長字符串這樣使得審計表難以搜索,因此您可能會考慮添加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 
+0

2.以下是我已經完成。 SELECT N'ID:'+ CAST(AddressID AS NVARCHAR(20))+ N'Address:'+ AddressLine1 + N','+ AddressLine2 + City + CAST (200))+ CAST(rowguid AS NVARCHAR(100))+ CAST(ModifiedDate AS NVARCHAR(40)) FROM(StateProvinceID AS NVARCHAR(20))+ CAST(PostalCode AS NVARCHAR(20))+ CAST(SpatialLocation AS NVARCHAR插入。我認爲這應該是正確的,但其中一列是地理類型。 –

+0

我把表設置爲nvarchar(300)並將所有轉換爲char,但是我得到的問題是「從字符串轉換爲uniqueidentifier時轉換失敗。」真的非常感謝你。 –

相關問題