SQL Server 2008 R2:触发“TEXT”列

SQL Server 2008 R2: Trigger on `TEXT` column

我有 table,它由数据类型为 text 的列组成。

Table EmployeeMaster

CREATE TABLE [EmployeeMaster]
(
    EmpID int identity(1,1),
    EmpName varchar(20),
    EmpPhone int,
    EmpAddress TEXT
);

我想在此 table 上创建审核日志。

审计Table:EmployeeMaster_Audit

CREATE TABLE [EmployeeMaster_Audit]
(
    EmpID int,
    EmpName varchar(20),
    EmpPhone int,
    EmpAddress VARCHAR(MAX)
);

正在为 INSERT 写入触发器。

触发器

CREATE TRIGGER [dbo].[EmployeeMaster_Insert]
ON [dbo].[EmployeeMaster]
FOR INSERT   
AS   

 INSERT INTO [dbo].[EmployeeMaster_Audit]
([EmpID], [EmpName], [EmpPhone], [EmpAddress])
SELECT CONVERT(int,[EmpID]) as [EmpID],[EmpName],[EmpPhone],CONVERT(varchar(max),[EmpAddress]) AS [EmpAddress]  FROM INSERTED 
GO

错误详情:创建触发器时出现以下错误:

Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables.

我的尝试CONVERT(varchar(max),[EmpAddress])

该问题的正确解决方案是将 text 列替换为 varchar(max) 列。

自 2008 版本引入 varbinary(max)varchar(max)nvarchar(max) 以来,ImageTextnText 数据类型已弃用。

有关详细信息,请阅读 ntext, text, and image (Transact-SQL) 上的 Microsoft 官方文档页面:

IMPORTANT! ntext, text, and image data types will be removed in a future version of SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

由于触发器在插入 之后触发,您可以简单地查询回EmployeeMaster 以获取插入的数据。像这样:

CREATE TRIGGER [dbo].[EmployeeMaster_Insert]
ON [dbo].[EmployeeMaster]
FOR INSERT   
AS   

INSERT INTO [dbo].[EmployeeMaster_Audit] ([EmpID], [EmpName], [EmpPhone], [EmpAddress])
SELECT  EM.[EmpID]
,       EM.[EmpName]
,       EM.[EmpPhone]
,       CONVERT(varchar(max), EM.[EmpAddress]) AS [EmpAddress]  
FROM    INSERTED I
INNER JOIN  dbo.[EmployeeMaster] EM
        ON  EM.[EmpID] = I.[EmpID]
GO

这是假设您无法更改 text 数据类型,请参阅 Zohar 的回答。