Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
Sql 触发器中的计数行错误_Sql_Database_Sql Server 2008 - Fatal编程技术网

Sql 触发器中的计数行错误

Sql 触发器中的计数行错误,sql,database,sql-server-2008,Sql,Database,Sql Server 2008,我在下面写了这个触发器。它在的计数(*)处生成错误。我希望当任何一行插入到表“Users”中时,使用这个触发器,当前存在于分配中的文件夹应该分配给User 例如:我将新行添加到表Users假设userD。然后在该触发器的帮助下,当前文件夹(如folderA、folderB、folderC应默认分配给userD,文件夹右侧可见。我已经在下面编写了这个触发器,但它是来自 CREATE TRIGGER Trigger_Insert ON Users FOR INSERT AS declare

我在下面写了这个触发器。它在的
计数(*)处生成错误。我希望当任何一行插入到表“Users”中时,使用这个触发器,当前存在于分配中的文件夹应该分配给User

例如:我将新行添加到表
Users
假设
userD
。然后在该触发器的帮助下,当前文件夹(如
folderA、folderB、folderC
应默认分配给
userD
,文件夹右侧
可见。我已经在下面编写了这个触发器,但它是来自

CREATE TRIGGER Trigger_Insert ON Users
FOR INSERT
AS
    declare @userid int;
    declare @username nvarchar(50);
    declare @useremail nvarchar(50);
    declare @userpassword nvarchar(50);

    select @userid=i.user_id from inserted i;   
    select @username=i.user_name from inserted i;   
    select @useremail=i.user_email from inserted i; 
    select @userpassword=i.user_password from inserted i;
    DECLARE @intFlag INT
    SET @intFlag =1
    WHILE (@intFlag <=COUNT(*) FROM Assignments;)  // Error Here
    BEGIN
       insert into UAssignment_Rights(
       ua_rights_id,ua_rights_name,assignment_id,user_id) 
       values(@userid,'Visible','','');
       SET @intFlag = @intFlag + 1
       PRINT 'AFTER INSERT trigger fired.'
    END 
GO
在用户上创建触发器插入
插入
作为
声明@userid int;
声明@username nvarchar(50);
声明@useremail nvarchar(50);
声明@userpassword nvarchar(50);
从插入的i中选择@userid=i.user\u id;
从插入的i中选择@username=i.user\u name;
从插入的i中选择@useremail=i.user\u email;
从插入的i中选择@userpassword=i.user\u密码;
声明@intFlag INT
设置@intFlag=1
而(@intFlag
COUNT(*)
只应作为
SELECT
HAVING
语句的一部分使用

如果
分配
循环期间不会作为
的一部分更改,请尝试替换

WHILE (@intFlag <=COUNT(*) FROM Assignments;)  // Error Here
COUNT(*)
只能用作
SELECT
具有
语句的一部分

如果
分配
循环期间不会作为
的一部分更改,请尝试替换

WHILE (@intFlag <=COUNT(*) FROM Assignments;)  // Error Here

答案已更新,以符合评论中的信息

我的观点是,大多数情况下,Sql Server中不需要循环或游标。通常基于集合的方法更简单、更快。在这种情况下,您可以使用
insert
的形式,它不插入固定值,而是
select
的结果

CREATE TRIGGER Trigger_Insert ON Users
FOR INSERT
AS
-- this is mandatory in trigger - you do not want @@rowcount reported to applications
-- to change as a result of statement in trigger (all of them, including set and select)

    set nocount on

-- You can simply take assignment_id directly from Assignments table
    insert into UAssignment_Rights(ua_rights_name, assignment_id, user_id)
    select 'Visible', a.assignment_id, i.user_id
      from Inserted i
     cross join dbo.Assignments a

    PRINT 'AFTER INSERT trigger fired.'
GO

p.S.是不带连接条件的连接的结果。这意味着返回的行是左表中每一行与右表中每一行的所有可能合并。

答案已更新,以符合注释中的信息

我的观点是,大多数情况下,Sql Server中不需要循环或游标。通常基于集合的方法更简单、更快。在这种情况下,您可以使用
insert
的形式,它不插入固定值,而是
select
的结果

CREATE TRIGGER Trigger_Insert ON Users
FOR INSERT
AS
-- this is mandatory in trigger - you do not want @@rowcount reported to applications
-- to change as a result of statement in trigger (all of them, including set and select)

    set nocount on

-- You can simply take assignment_id directly from Assignments table
    insert into UAssignment_Rights(ua_rights_name, assignment_id, user_id)
    select 'Visible', a.assignment_id, i.user_id
      from Inserted i
     cross join dbo.Assignments a

    PRINT 'AFTER INSERT trigger fired.'
GO


p.S.是不带联接条件的联接的结果。这意味着返回的行是左表中的每一行与右表中的每一行的所有可能合并。

永远不要假定插入的
只包含一条记录,因为在Sql Server中,每个语句触发一次触发器,并且该语句可能已被
插入。。.选择
,结果是0、1或多行。也就是说,你想插入什么?在这里你创建了许多相同的行。你可能不需要循环,因为你可以插入选择的结果:。@NikolaMarkovinović如何实现我的目标。请把你的评论说得更清楚。我有点困惑。永远不要假设
inserted
只包含一条记录,因为在Sql Server中,每个语句触发一次触发器,并且该语句可能已被插入到…select
中,导致0、1或多行。也就是说,要插入什么?在这里创建相同行数。您可能不需要循环,因为您可以插入选择的结果:。@NikolaMarkovinović如何实现我的目标。请把你的评论说得更清楚。我有点困惑。不,不要鼓励使用插入的标量变量。这是在任何情况下都不应该在触发器中完成的事情。插入可以包含多行!!!!注意@HLGEM。老实说,我很少使用ch触发器,我认为它们很危险,因为它们不明显。我认为,当你想保持数据完整性时,不使用它们更危险,但我会努力修复其他人因设计不当而损坏的数据库。相信我,数据完整性从来都无法从应用程序中成功维护。我基于30年的工作经验king拥有数百个数据库,涵盖了许多子领域。我知道你来自@HLGEM。尽管删除了你反对的部分,但你没有删除否决票。适合你自己谢谢@HLGEM,这是值得赞赏的。不,不要鼓励使用插入的标量变量。这是在任何情况下都不应该使用的东西e在触发器中完成。Inserted可以包含多行!!!!Point Taked@HLGEM。老实说,我很少接触触发器,我认为它们很危险,因为它们不明显。我认为当您想要保持数据完整性时,不使用触发器要危险得多,但我会尝试修复其他人用坏的des破坏的数据库ign.相信我,数据完整性从来不会从应用程序中成功维护。我是基于30年来与数百个数据库的合作,这些数据库涵盖了许多子领域。我知道你来自@HLGEM。尽管删除了你反对的部分,但你不会删除否决票。适合你自己谢谢@HLGEM,这是值得赞赏的最好的答案。谢谢你,先生。你能给我解释一下
插入作业和插入表格的笛卡尔积吗
?因为我对这一切都不熟悉。
而@intFlag@ZoyaSheikh你可以直接从作业表格中获取作业id。请看我更新的答案。@NikolaMarkovinović谢谢你,先生。还有最后一个问题stion:我可以复制更新触发器和删除触发器的相同代码吗?到目前为止,这是最好的答案。谢谢你,先生。你能解释一下
插入任务和插入表的笛卡尔积吗
?因为我对这一切都是新手。
而@intFlag@ZoyaSheikh你可以直接从任务表中获取任务id。请看一看请看我的最新答案。@NikolaMarkovinović谢谢您,先生。还有最后一个问题:我可以复制更新触发器和删除触发器的相同代码吗?