2014-05-14 121 views
1

我最好是希望使用此触发器来处理从Excel电子表格导入客户端数据的表格。在某些情况下,名称都是CAPITALIZED,我有一些函数会将它们更新为小写字母,除了第一个字母,撇号后的第一个字母等,我在触发器中调用它。以下是我的功能:AFTER INSERT,UPDATE导入数据时触发器不会更新

CREATE FUNCTION [dbo].[CapString] (@InputString varchar(4000)) 
RETURNS VARCHAR(4000) 
AS 
BEGIN  
DECLARE @Index   INT 
DECLARE @Char   CHAR(1) 
DECLARE @PrevChar  CHAR(1) 
DECLARE @OutputString VARCHAR(255) 

SET @OutputString = LOWER(@InputString) 
SET @Index = 1 

WHILE @Index <= LEN(@InputString) 
BEGIN 
    SET @Char  = SUBSTRING(@InputString, @Index, 1) 
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' 
         ELSE SUBSTRING(@InputString, @Index - 1, 1) 
        END 
    IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') 
    BEGIN 
     IF @PrevChar != '''' OR UPPER(@Char) != 'S' 
      SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) 
    END 
    SET @Index = @Index + 1 
END  
RETURN @OutputString 
END 

以下是我的触发:

CREATE TRIGGER [dbo].[Test_UpdateTrigger] 
    ON [dbo].[Test] 
    AFTER INSERT, UPDATE 
AS 
     UPDATE [dbo].[Test] 
    SET FName = dbo.CapString(FName), 
     LName = dbo.CapString(LName) 
     WHERE JuncID IN (SELECT JuncID FROM Inserted) 

所以,我的问题是,它更新大写字母当我插入客户降低的情况下使用SELECT语句或GUI手动。当我从Excel导入数据时,它什么也不做。在这种情况下,我有什么错误或需要完成的吗?谢谢!

+0

*您如何*从Excel导入 – podiluska

+0

@podiluska我使用Management Studio导入。右键点击DB =>任务=>导入数据...然后按照向导。 –

回答

1

使用bcpbulk insert时,默认情况下禁用触发器。

http://technet.microsoft.com/en-us/library/ms187640(v=sql.105).aspx

使用

bcp -h "FIRE_TRIGGERS" 

BULK INSERT FIRE_TRIGGERS 
+0

非常感谢,这是一个非常有用的信息。如果你提示我如何在我的触发器中使用'BULK INSERT FIRE_TRIGGERS',那将会很棒。非常感谢! –

+1

您在导入时使用它,而不是触发器。这是一种进口机制的设置。 – podiluska

+0

非常感谢您的帮助。所以......我们还在前端为用户导入了一个导入功能,并且它看起来像使用该GUI一样工作。 –

1

“导入数据...” 在SSMS选项使用导入和导出数据的工具,反过来,创建并运行SSIS包为你。为了让SSIS在OLEDB目标上触发触发器,你必须经历一些环节。但他们详细here(搜索“FIRE_TRIGGERS”)。

相关问题