DECLARE tableCursor CURSOR FOR
SELECT NAME TABLE_NAME
FROM SYSOBJECTS
WHERE LEFT(NAME, 2) = 'T_' AND NAME NOT IN('') AND (NAME LIKE '%MAP' OR NAME IN ('T_CMIS_CODE'))
OPEN tableCursor
FETCH NEXT FROM tableCursor into @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
-- Generate the column list: Begin
DECLARE columnCursor CURSOR FOR
SELECT C.NAME COLUMN_NAME, T.NAME COLUMN_TYPE
FROM SYSOBJECTS O, SYSCOLUMNS C, SYSTYPES T
WHERE O.NAME = @tableName AND O.ID = C.ID AND C.XUSERTYPE = T.XUSERTYPE AND T.NAME <> 'varbinary'
OPEN columnCursor
SET @auditColumnsScript = ''
FETCH NEXT FROM columnCursor INTO @columnName, @columnType
WHILE @@FETCH_STATUS = 0
BEGIN
SET @auditColumnsScript = @auditColumnsScript + '''' + @columnName + ' ='' + CONVERT(VARCHAR, ISNULL(' + @columnName + ','''')) + '','' + '
FETCH NEXT FROM columnCursor INTO @columnName, @columnType
END
SET @auditColumnsScript = LEFT(@auditColumnsScript, LEN(@auditColumnsScript) - 8)
CLOSE columnCursor
DEALLOCATE columnCursor
-- Generate the column list: End
SET @trigerName = 'TR' + RIGHT(@tableName, LEN(@tableName)-1)
SET @trigerScript = '
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = ''' + @trigerName + ''' AND TYPE = ''TR'') DROP TRIGGER ' + @trigerName
IF @execute = 1 EXEC (@trigerScript)
PRINT @trigerScript
PRINT 'GO'
SET @trigerScript = '
/*
Module : CMIS II
Author : Auto Generater
Date : 03/03/2006
Desc :
Output :
-----------------------------------------------------
Date Author Remark
*/
CREATE TRIGGER ' + @trigerName +'
ON ' + @tableName + '
AFTER INSERT, UPDATE, DELETE
NOT FOR REPLICATION
AS
DECLARE @v_UserID VARCHAR(255),
@v_TableName VARCHAR(255),
@v_Action VARCHAR(1),
@v_PreviousValue VARCHAR(1000),
@v_NewValue VARCHAR(1000),
@v_InsertedRowCount INT,
@v_DeletedRowCount INT
SET @v_TableName=''' + @tableName + '''
SELECT @v_InsertedRowCount = Count(*) FROM INSERTED
SELECT @v_DeletedRowCount = Count(*) FROM DELETED
IF (@v_InsertedRowCount = 0)
BEGIN
IF (@v_DeletedRowCount = 0)
RETURN -- No record updated to deleted
ELSE
BEGIN -- Delete action
SELECT @v_UserID = LAST_UPDATED_BY, @v_Action = ''D'' FROM DELETED
IF (CHARINDEX('';'', @v_UserID) = 0)
SET @v_UserID = ''UNKNOWN USER''
ELSE
SET @v_UserID = REPLACE(@v_UserID, LEFT(@v_UserID,charindex('';'', @v_UserID)),'''')
SELECT @v_PreviousValue = ' + @auditColumnsScript + ' FROM DELETED
SET @v_PreviousValue = REPLACE(@v_PreviousValue, '';'' + @v_UserID, '''')
END
END
ELSE
BEGIN
IF (@v_DeletedRowCount = 0)
BEGIN -- Insert action
SELECT @v_UserID = CREATED_BY, @v_Action = ''I'' FROM INSERTED
SELECT @v_NewValue = ' + @auditColumnsScript + ' FROM INSERTED
END
ELSE
BEGIN -- Update action
SELECT @v_UserID = LAST_UPDATED_BY, @v_Action=''U'' FROM INSERTED
IF (UPDATE(LAST_UPDATED_BY) AND NOT UPDATE(LAST_UPDATED_DATE) AND CHARINDEX('';'', @v_UserID) > 0)
RETURN -- This update action is prepare the data for delete action
SELECT @v_NewValue = ' + @auditColumnsScript + ' FROM INSERTED
SELECT @v_PreviousValue = ' + @auditColumnsScript + ' FROM DELETED
END
END
--创建存储过程
create procedure sp_test(@tname varchar(100))
as
begin
declare @name varchar(100),@xtype int,@v varchar(8000),@s varchar(8000)
set @v = 'declare t_cursor cursor for select name,xtype from syscolumns where id=object_id('''+@tname+''')'
exec(@v)
open t_cursor
fetch next from t_cursor into @name,@xtype
select @s = '',@v = ''
while @@fetch_status = 0
begin
set @s = @s + ','+@name
set @v = @v + ','+case when @xtype in(173,175,34,239,99,231,35,165,167) then ''''''
else '0'
end
fetch next from t_cursor into @name,@xtype
end
close t_cursor
deallocate t_cursor
set @s = 'insert into '+@tname+'('+stuff(@s,1,1,'')+') values('+stuff(@v,1,1,'')+')'
exec(@s)
end
go
--创建测试数据表
create table test(id int not null,name varchar(10) not null,dates datetime not null)
go
--执行存储过程对test表插入空行
exec sp_test 'test'
--查看存储过程执行结果
select * from test
/*
id name dates
-- ---- -----------------------
0 1900-01-01 00:00:00.000
*/
--清除测试环境
drop table test
drop procedure sp_test