Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
将插入和删除的表保存到变量中,以便在.NET代码中使用(通过sp_方法)[SQL Server 2000]_.net_Sql Server_Tsql_Sql Server 2000 - Fatal编程技术网

将插入和删除的表保存到变量中,以便在.NET代码中使用(通过sp_方法)[SQL Server 2000]

将插入和删除的表保存到变量中,以便在.NET代码中使用(通过sp_方法)[SQL Server 2000],.net,sql-server,tsql,sql-server-2000,.net,Sql Server,Tsql,Sql Server 2000,我试图在SQLServer中创建一个SQL触发器,它将以某种方式序列化插入和删除的表,以便在.NET代码中使用(通过sp_方法)。我想这是通用的足以用于任何表 我的第一次尝试涉及使用“for xml”将其序列化为xml,并将其传递给.NET代码。但是,我无法将XML分配给变量,因为SQLServer2000不支持它(2005还不是我们的选项)。唯一的选择是手动执行序列化(请参阅),这不符合我的泛型要求 --This does not work declare @OldValue varchar(

我试图在SQLServer中创建一个SQL触发器,它将以某种方式序列化插入和删除的表,以便在.NET代码中使用(通过sp_方法)。我想这是通用的足以用于任何表

我的第一次尝试涉及使用“for xml”将其序列化为xml,并将其传递给.NET代码。但是,我无法将XML分配给变量,因为SQLServer2000不支持它(2005还不是我们的选项)。唯一的选择是手动执行序列化(请参阅),这不符合我的泛型要求

--This does not work
declare @OldValue varchar(5000)
select @OldValue = (select * from Deleted for XML auto)

有没有人知道一种通用的方法,使用什么方法?我不在乎格式,只要我能将列名和值输入到我的.NET代码中。

你能在没有变量的情况下完成吗,例如:

select * from Deleted for XML auto
使得触发器返回一个XML结果集

或者,在触发器内:

declare @tablename varchar(256) 
set @tablename = quotename(object_name(@@procid)+'_'+convert(varchar,@@spid))
select * into #inserted from inserted
exec ('select * into '+@tablename+' from #inserted')
exec dbo.myGenericXML_generator @tablename
exec ('drop table '+@tablename)
有点巴洛克风格,但如果你的音量足够小,它可能会工作。您还需要添加错误处理,这只是传达了想法

或者,在将数据复制到永久表后,可以向队列中添加一个条目,并分别让某个进程使用队列并删除表


更好的是,编写一些代码来自动生成触发器和系统表中的所有XML生成代码。例如,代码生成代码生成XML。

您知道触发器发生在事务中,您正在尝试的触发器将延长事务,更重要的是,依赖SQL Server之外的进程可用且无错误地完成,对吗


我建议不要在触发器中执行此操作,尤其是sp_OA*之类的操作。通过将插入表和删除表的结果排队到暂存表中,并让作业或windows服务处理数据,您能否完成所需的工作?

我知道这是在事务中完成的,并且我已确保在.NET代码中实际执行工作的代码在BackgroundWorker中运行,从而消除延迟和错误。我已经在事务中对运行sp_oa进行了基准测试,并且没有看到这样做会对性能造成任何重大影响。当然这是IMHO,因为我对SQL Server相当陌生,但我有丰富的.NET经验。我希望避免让windows服务不断轮询数据库,因为我需要足够快的更改通知,并且我不想用不断的查询来猛击数据库。作业占用的内存会更少吗?