22,300
社区成员




--SQL SERVER 的临时表达不到postgresql的效果,建议:
--方法1
com.ExecuteNonQuery(); --生成一个guid+机器名+登陆名,三个字段缓存到实体表
object obj = invocation.Proceed(); --把GUID传给这个函数,从上面的实体表中取到相应数据
--方法2
com.ExecuteNonQuery(); --删除这行
object obj = invocation.Proceed(); --把删除的那行代码放在这个里面的SQL中
USE CSDN
go
--测试数据
CREATE TABLE trigger_test(id INT,SPID INT, name CHAR(8000)) --加个name字段,让插入的2条数据,分别放在2个页面上,防止闩锁对测试的影响
go
--创建触发器
CREATE TRIGGER tr_test1 ON dbo.trigger_test
AFTER INSERT, UPDATE
as
BEGIN
UPDATE A
SET a.spid = (SELECT TOP(1) spid FROM #temp) --请明这里访问的#temp表,只是当前登陆用户的
from trigger_test A
INNER JOIN INSERTED B
ON a.id = b.id
END
go
--第一个连接,分两步执行:
BEGIN TRAN
--#1.创建临时表
IF object_id('tempdb..#temp', 'u') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #TEMP (SPID INT)
INSERT #temp(SPID) SELECT @@SPID --第一步执行到这儿时,停止,再去另外一个连接中的所有SQL。然后再回来,执行完下面的SQL
--#2.执行insert或update语句
INSERT dbo.trigger_test (id, name) VALUES(5, '5')
--#3.触发触发器
COMMIT TRAN
--第二个连接,一下子执行完
USE CSDN
go
BEGIN TRAN
--#1.创建临时表
IF object_id('tempdb..#temp', 'u') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #TEMP (SPID INT)
INSERT #temp(SPID) SELECT @@SPID
--#2.执行insert或update语句
INSERT dbo.trigger_test (id, name) VALUES(0, '0')
--#3.触发触发器
COMMIT TRAN
--查看结果
SELECT * FROM trigger_test
/*
id SPID name
0 65 0
5 52 5
*/
[/quote]
辛苦了!感谢!
下面是我的一个例子!说明了 一个会话结束 临时表就已经不存在了 这是我目前的问题!
-- PROC: set_prc_info(@user_code varchar(12), @term_id varchar(100), @func varchar(50))
-- DROP PROC set_prc_info1
create PROC [dbo].[set_prc_info1](@user_code varchar(12), @term_id varchar(100), @func varchar(50))
AS
declare @sql as varchar(100)
if Object_id('#prc_env') is null
begin
set @sql = 'CREATE TABLE #prc_env(userid varchar(12),termid varchar(100),funcid varchar(50));';
--执行这个创建临时表的SQL文,会话已经结束 (这相当于我在应用程序中 用 cmd.ExecuteNoQuery() 执行创建临时表)
EXEC(@sql);
--执行到这个地方时 这个临时表已经不存在了(这里相当于我的应用程序中执行其它的Insert/Update 语句)
insert into #prc_env (userid,termid,funcid) VALUES (@user_code,@term_id,@func);
end
--测试一下发现 那个临时表已经不存在了
exec [dbo].[set_prc_info1] 'test1','test2','test3'
USE CSDN
go
--测试数据
CREATE TABLE trigger_test(id INT,SPID INT, name CHAR(8000)) --加个name字段,让插入的2条数据,分别放在2个页面上,防止闩锁对测试的影响
go
--创建触发器
CREATE TRIGGER tr_test1 ON dbo.trigger_test
AFTER INSERT, UPDATE
as
BEGIN
UPDATE A
SET a.spid = (SELECT TOP(1) spid FROM #temp) --请明这里访问的#temp表,只是当前登陆用户的
from trigger_test A
INNER JOIN INSERTED B
ON a.id = b.id
END
go
--第一个连接,分两步执行:
BEGIN TRAN
--#1.创建临时表
IF object_id('tempdb..#temp', 'u') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #TEMP (SPID INT)
INSERT #temp(SPID) SELECT @@SPID --第一步执行到这儿时,停止,再去另外一个连接中的所有SQL。然后再回来,执行完下面的SQL
--#2.执行insert或update语句
INSERT dbo.trigger_test (id, name) VALUES(5, '5')
--#3.触发触发器
COMMIT TRAN
--第二个连接,一下子执行完
USE CSDN
go
BEGIN TRAN
--#1.创建临时表
IF object_id('tempdb..#temp', 'u') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #TEMP (SPID INT)
INSERT #temp(SPID) SELECT @@SPID
--#2.执行insert或update语句
INSERT dbo.trigger_test (id, name) VALUES(0, '0')
--#3.触发触发器
COMMIT TRAN
--查看结果
SELECT * FROM trigger_test
/*
id SPID name
0 65 0
5 52 5
*/