代码如下:CREATE TRIGGER tr_UserData_ofi
ON UserData
INSTEAD OF INSERT
AS
SET NOCOUNT ON DECLARE @id varchar(20), @table varchar(32)
DECLARE cu_data CURSOR FAST_FORWARD
FOR SELECT id FROM inserted OPEN cu_data
FETCH NEXT FROM cu_data INTO @id WHILE @@FETCH_STATUS = 0
BEGIN
IF LEN(@id) <= 9
SET @table = 'UserData'
ELSE
SET @table = 'UserData_' SELECT * INTO #TempRow FROM inserted WHERE id = @id
EXECUTE ('INSERT ' + @table + ' SELECT * FROM #TempRow')
DROP TABLE #TempRow FETCH NEXT FROM cu_data INTO @id
END CLOSE cu_data
DEALLOCATE cu_data
GOINSERT UserData VALUES ('1111111111', '') -- 成功
INSERT UserData VALUES ('111111111', '') -- 失败如果id的长度小于10,向UserData添加记录,已经关闭了触发器的递归、嵌套,结果还是提示:“INSTEAD OF 触发器不支持直接递归。触发器执行失败。”救救我吧
ON UserData
INSTEAD OF INSERT
AS
SET NOCOUNT ON DECLARE @id varchar(20), @table varchar(32)
DECLARE cu_data CURSOR FAST_FORWARD
FOR SELECT id FROM inserted OPEN cu_data
FETCH NEXT FROM cu_data INTO @id WHILE @@FETCH_STATUS = 0
BEGIN
IF LEN(@id) <= 9
SET @table = 'UserData'
ELSE
SET @table = 'UserData_' SELECT * INTO #TempRow FROM inserted WHERE id = @id
EXECUTE ('INSERT ' + @table + ' SELECT * FROM #TempRow')
DROP TABLE #TempRow FETCH NEXT FROM cu_data INTO @id
END CLOSE cu_data
DEALLOCATE cu_data
GOINSERT UserData VALUES ('1111111111', '') -- 成功
INSERT UserData VALUES ('111111111', '') -- 失败如果id的长度小于10,向UserData添加记录,已经关闭了触发器的递归、嵌套,结果还是提示:“INSTEAD OF 触发器不支持直接递归。触发器执行失败。”救救我吧
ON UserData
INSTEAD OF INSERT
AS
SET NOCOUNT ON DECLARE @id varchar(20), @table varchar(32)
DECLARE cu_data CURSOR FAST_FORWARD
FOR SELECT id FROM inserted OPEN cu_data
FETCH NEXT FROM cu_data INTO @id WHILE @@FETCH_STATUS = 0
BEGIN
IF LEN(@id) <= 9
insert UserData select * from inserted WHERE id = @id
ELSE
insert UserData_ select * from inserted WHERE id = @id
FETCH NEXT FROM cu_data INTO @id
END CLOSE cu_data
DEALLOCATE cu_data
GO
ON UserData
INSTEAD OF INSERT
AS
SET NOCOUNT ON insert UserData select * from inserted WHERE LEN(id) <= 9 insert UserData_ select * from inserted WHERE LEN(id) > 9
GO
LEN(id) <= 9 插入'UserData'表
LEN(id) > 9 插入'UserData_' + SUBSTRING(id, 1, LEN(id) - 10)表
所以用游标判断每条记录
ON UserData
INSTEAD OF INSERT
AS
SET NOCOUNT ON DECLARE @id varchar(20), @table varchar(32)
DECLARE cu_data CURSOR FAST_FORWARD
FOR SELECT id FROM inserted OPEN cu_data
FETCH NEXT FROM cu_data INTO @id WHILE @@FETCH_STATUS = 0
BEGIN
IF LEN(@id) <= 9
insert UserData select * from inserted WHERE id = @id
ELSE
begin
SET @table = 'UserData_'+SUBSTRING(@id, 1, LEN(@id) - 10) SELECT * INTO #TempRow FROM inserted WHERE id = @id
EXECUTE ('INSERT ' + @table + ' SELECT * FROM #TempRow')
DROP TABLE #TempRow
end
FETCH NEXT FROM cu_data INTO @id
END CLOSE cu_data
DEALLOCATE cu_data
GO
SUBSTRING(id, 1, LEN(id) - 10)可以列举(因为你事先有表应该可以列举的)
可以这样实现,效率高些,否则用临时表很不爽CREATE TRIGGER tr_UserData_ofi
ON UserData
INSTEAD OF INSERT
AS
SET NOCOUNT ON insert UserData select * from inserted WHERE LEN(id) <= 9 insert UserData_aaa select * from inserted WHERE LEN(id) > 9 and SUBSTRING(id, 1, LEN(id) - 10)='aaa' insert UserData_bbb select * from inserted WHERE LEN(id) > 9 and SUBSTRING(id, 1, LEN(id) - 10)='bbb' insert UserData_001 select * from inserted WHERE LEN(id) > 9 and SUBSTRING(id, 1, LEN(id) - 10)='001'...GO