Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 插入触发器后…循环_Tsql_Stored Procedures_Sql Server 2005_Triggers - Fatal编程技术网

Tsql 插入触发器后…循环

Tsql 插入触发器后…循环,tsql,stored-procedures,sql-server-2005,triggers,Tsql,Stored Procedures,Sql Server 2005,Triggers,如果我在一个表上创建了一个After Insert触发器,并且在该触发器中执行了While循环来迭代可能的多行,那么处理负载会是什么问题呢 最终的结果是,99.999%的时间我只有一行,但由于未来不可预测,我还希望能够处理插入的多行 触发模式: 1在表中插入信息 2如果可能,通过存储过程创建特定于客户端的视图 你说呢 还没有完全发展,但这是我正在寻找的设计,可能结构不健全,但应该得到跨越点 CREATE TRIGGER dbo.New_Client_Setup ON dbo.clien

如果我在一个表上创建了一个After Insert触发器,并且在该触发器中执行了While循环来迭代可能的多行,那么处理负载会是什么问题呢

最终的结果是,99.999%的时间我只有一行,但由于未来不可预测,我还希望能够处理插入的多行

触发模式: 1在表中插入信息 2如果可能,通过存储过程创建特定于客户端的视图

你说呢

还没有完全发展,但这是我正在寻找的设计,可能结构不健全,但应该得到跨越点

CREATE TRIGGER dbo.New_Client_Setup 
   ON  dbo.client 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    --Fill Temp Table
     select * into #clients
     from inserted

     --Iterate through Temp Table
     While (select count(*) from #clients) <> 0 BEGIN
         declare @id int, @clnt nvarchar(10)

         select top(1)
            @id = id
            , @clnt = short
         order by id desc

         Execute dbo.sp_Create_View_Client ( @id, @clnt )

         -- Drop used ID
         delete from #clients
         where id = @id
     END

     Drop table #clients
END
GO

同样,观察触发器的设计不一定是语法上的糖分,阅读注释,我认为您不必在触发器中这样做。我想说的是,您应该在事务中作为insert语句的一部分执行此操作-即,执行insert,然后执行您希望执行的循环-执行dbo.sp_Create_View_Client


我要提到的第二件事是dbo.sp\u Create\u View\u Client到底在做什么——它必须依赖于insert吗?也就是说,如果insert工作正常,而触发器失败,会发生什么?我可能会在一个事务中完成SP的整个插入和执行,以保持数据完整性。

从设计角度看,阅读注释,我认为您不必在触发器中执行此操作。我想说的是,您应该在事务中作为insert语句的一部分执行此操作-即,执行insert,然后执行您希望执行的循环-执行dbo.sp_Create_View_Client


我要提到的第二件事是dbo.sp\u Create\u View\u Client到底在做什么——它必须依赖于insert吗?也就是说,如果insert工作正常,而触发器失败,会发生什么?我可能会在一个事务中完成SP的整个插入和执行,以保持数据的完整性。

触发器中的WHILE循环是一个非常糟糕的想法,对于您的DB设计来说是一种代码味道。如果您的设计需要这样做,那么某个地方出现了严重的错误。是的,这是我所知道的,但似乎是处理插入多行可能性的唯一解决方案。因为我正在处理SQL 2005 Std。如果您发布代码,可能有人会向您展示一种不同的可能性。@BalamBalam-在SQL Server中,每个原子操作插入、删除、,更新-受影响行的结果集存储在特殊的删除和插入表中。您可以加入插入表,而不是创建新的临时表。这应该可以在SQL2005标准中正常工作。触发器中的WHILE循环是一个非常糟糕的想法,对于您的DB设计来说是一种代码味道。如果您的设计需要这样做,那么某个地方出现了严重的错误。是的,这是我所知道的,但似乎是处理插入多行可能性的唯一解决方案。因为我正在处理SQL 2005 Std。如果您发布代码,可能有人会向您展示一种不同的可能性。@BalamBalam-在SQL Server中,每个原子操作插入、删除、,更新-受影响行的结果集存储在特殊的删除和插入表中。您可以加入插入表,而不是创建新的临时表。这应该可以在SQL2005标准中正常工作。它将创建可用于新客户机的视图,因为我还在设置要分区的数据库。我已经绘制了配分函数和方案,现在我正在尝试设置视图。客户端之间视图结构的唯一不同之处是它们的唯一ID。那么,为什么不在插入期间/之后执行此操作,而不是在触发器上执行此操作呢?在大多数情况下,插入将发生在网站上,我希望包括必要的结构重新设计。主要的一点是,我正在基于客户机ID在表上实现一个分区,因此,在Insert之后是实现任何完全基于客户机及其唯一ID的操作的最合适时机。它将创建新客户机可用的视图,因为我也在设置要分区的数据库。我已经绘制了配分函数和方案,现在我正在尝试设置视图。客户端之间视图结构的唯一不同之处是它们的唯一ID。那么,为什么不在插入期间/之后执行此操作,而不是在触发器上执行此操作呢?在大多数情况下,插入将发生在网站上,我希望包括必要的结构重新设计。主要的一点是,我正在基于客户机ID在表上实现一个分区,因此,在Insert之后是实现完全基于客户机及其唯一ID的任何内容的最合适时机。