- 浏览: 540670 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (401)
- 默认类别 (1)
- AJAX (0)
- Coffee House (81)
- cvs (1)
- cygwin (2)
- Eclipse (1)
- EJB (0)
- ERP (1)
- Hibernate (16)
- Html (8)
- iBatis (0)
- IDE (0)
- J2SE (7)
- Javascript (11)
- Jboss (0)
- Jdbc (4)
- Jni--Communication (1)
- Management (10)
- NetWork (0)
- Oracle (0)
- PowerDesigner (0)
- Proxool (1)
- Question (0)
- SoftwareEngineering (12)
- Spring (13)
- SqlServer (22)
- Struts (0)
- Tutorial (1)
- VFP (0)
- Web Service (0)
- WebWork (6)
- WSAD (1)
- test (1)
最新评论
-
zyp731:
虽然很简单,但是很适用,我就找了好久,非常不喜欢大黑点的那种样 ...
ERWIN改变关系之间连线的样式 -
Love_洋果子:
写的很实在,我们老总及老大就很注重测试部门,所以自己做的很开心 ...
再谈测试 -
娴静女生:
2010年开始用新浪微博ID:http://t.sina.co ...
微博大家在写吗? -
saapaa:
hgq0011 写道 大家有开通微博吗?
...
微博大家在写吗? -
lxtxlyb:
文章太给力了,但是我现在有个问题,同一个tomcat下面,其他 ...
spring+hibernate初始化出错,错误真是隐蔽得很,让人郁闷,,,
在网上找到了一个类似的文章http://www.cnblogs.com/delphi/articles/121516.html来引用这文章.我在它的基础上加了更详细注解。 如下:
CREATE Table T_Test (
f_id int IDENTITY(1, 1) Primary Key,
f_char Char(8) default '',
f_varchar varchar(8) default '',
f_nvarchar nvarchar(8) default '',
f_datetime datetime default getdate(),
f_int int default 0,
f_bigint bigint default 0,
f_decimal decimal(18, 6) default 0.00,
f_number numeric(18, 6) default 0.00,
f_float float default 0.00
)
go
INSERT INTO T_Test (f_char) values('001')
INSERT INTO T_Test (f_char) values('002')
go
select * from t_test
If exists(select * from sysobjects where id=object_id(N'[dbo].[Tri_Test_Upd]') and objectproperty(id,N'istrigger')=1)
DROP TRIGGER Tri_Test_Upd
go
CREATE TRIGGER Tri_Test_Upd ON T_Test --WITH ENCRYPTION
FOR UPDATE
AS
DECLARE @iRowCnt INT --列数
SET @iRowCnt = @@rowcount
IF @iRowCnt < 1
RETURN
DECLARE
@sTable VARCHAR(128), --表名
@sPKName VARCHAR(32), --主鍵名
@sColName VARCHAR(128) --列名
DECLARE
@iColCnt INT, --列数
@iColId INT --列id
DECLARE
@i TINYINT,
@j TINYINT,
@iSegment TINYINT, --以8为除数得余数(有少个分段)
@iVal TINYINT, --被更新过的字段的十六进制值
@iLog2 TINYINT
DECLARE
@sSQL VARCHAR(8000) --执行的sql
SET @sTable = 't_test'
SET @sPKName = 'f_id'
-- 求得当前表列个数
SELECT @iColCnt = Count(1) FROM syscolumns WHERE id = object_id(@sTable)
-- 以8个字段为一小段
SET @iSegment = CASE
WHEN @iColCnt / 8 = @iColCnt / 8.0 --如果列总数是8的倍数那就取整数,否则取整数再加1
THEN
@iColCnt / 8
ELSE
@iColCnt / 8 + 1
END
-- 将数据存入临时表
SELECT * INTO #Inserted FROM Inserted --更新的数据
SELECT * INTO #Deleted FROM Deleted --更新前的数据
--中间处理数据用
CREATE TABLE #Temp(
f_PKVal varchar(254) not null primary key, --主键
f_OldVal varchar(254), --原来的值
f_NewVal varchar(254) --新的值
)
SET @i = 0 --循环整个分段(也就所有的字段)
WHILE @i < @iSegment
BEGIN
--8个字段为一个分区,当表的列数大于8,那么计算被更新过的字段的十六进制值方法不同
IF @iColCnt < 9 --表的列数小于8
SET @iVal= COLUMNS_UPDATED()
ELSE --表的列数大于8
SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)
--等于零,则表示当前小节所对应的8个字段没有被更新(修改)过,中止本次循环,继续下一次循环
IF @iVal = 0
BEGIN
SET @i = @i + 1
CONTINUE
END
WHILE @iVal > 0
BEGIN
SET @j = 0
SET @iLog2 = @iVal / 2 --被更新字段十六进制值除2得余数
WHILE @iLog2 > 0
BEGIN
SET @j = @j + 1
SET @iLog2 = @iLog2 / 2
END --end @iLog2 > 0
-- 得到被Update 的 列ID
SET @iColId = 8 * @i + @j + 1
-- 将Update列名 赋予 @sColName
SELECT @sColName = S.name FROM Inserted as I,Deleted as D,Syscolumns as S WHERE I.F_id = D.F_id
AND S.id = object_id(@sTable)
AND S.colid = @iColId
Truncate table #Temp
--拼成功能语句
SET @sSQL = 'INSERT INTO #Temp (f_PkVal, f_OldVal, f_NewVal) ' +
'SELECT Convert( varchar(200), I.' + @sPkName + '), ' +
'Convert( varchar(200), D.' + @sColName + '), ' +
'Convert( varchar(200), I.' + @sColName + ') ' +
'FROM #Inserted as I, #Deleted as D ' +
'WHERE I.' + @sPKName + ' = D.' + @sPKName +
' AND I.' + @sColName + ' <> D.' + @sColName
EXEC(@sSQL) --执行sql
-- 测试输出
Select f_pkVal, @sColName as f_column_name, f_oldVal, f_newVal FROM #temp
-- 实际上用将信息处理后插入消息表
/**//**//**//*
..
INSERT INTO T_Message(.)
SELECT 要组成的内容
FROM #temp
*/
SET @iVal = @iVal - Power(2, @j)
END -- end @iVal > 0
SET @i = @i + 1
END -- end @i < @iSegment
DROP TABLE #Inserted
DROP TABLE #Deleted
DROP TABLE #Temp
go
select from Syscolumns as S object_id('t_test')
SELECT s.name ,s.colid FROM syscolumns as s WHERE id = object_id('t_test') and s.colid = 1
Update T_test Set f_datetime = getdate(), f_float = 0.0123, f_int= 1 where f_id = 2
f_id int IDENTITY(1, 1) Primary Key,
f_char Char(8) default '',
f_varchar varchar(8) default '',
f_nvarchar nvarchar(8) default '',
f_datetime datetime default getdate(),
f_int int default 0,
f_bigint bigint default 0,
f_decimal decimal(18, 6) default 0.00,
f_number numeric(18, 6) default 0.00,
f_float float default 0.00
)
go
INSERT INTO T_Test (f_char) values('001')
INSERT INTO T_Test (f_char) values('002')
go
select * from t_test
If exists(select * from sysobjects where id=object_id(N'[dbo].[Tri_Test_Upd]') and objectproperty(id,N'istrigger')=1)
DROP TRIGGER Tri_Test_Upd
go
CREATE TRIGGER Tri_Test_Upd ON T_Test --WITH ENCRYPTION
FOR UPDATE
AS
DECLARE @iRowCnt INT --列数
SET @iRowCnt = @@rowcount
IF @iRowCnt < 1
RETURN
DECLARE
@sTable VARCHAR(128), --表名
@sPKName VARCHAR(32), --主鍵名
@sColName VARCHAR(128) --列名
DECLARE
@iColCnt INT, --列数
@iColId INT --列id
DECLARE
@i TINYINT,
@j TINYINT,
@iSegment TINYINT, --以8为除数得余数(有少个分段)
@iVal TINYINT, --被更新过的字段的十六进制值
@iLog2 TINYINT
DECLARE
@sSQL VARCHAR(8000) --执行的sql
SET @sTable = 't_test'
SET @sPKName = 'f_id'
-- 求得当前表列个数
SELECT @iColCnt = Count(1) FROM syscolumns WHERE id = object_id(@sTable)
-- 以8个字段为一小段
SET @iSegment = CASE
WHEN @iColCnt / 8 = @iColCnt / 8.0 --如果列总数是8的倍数那就取整数,否则取整数再加1
THEN
@iColCnt / 8
ELSE
@iColCnt / 8 + 1
END
-- 将数据存入临时表
SELECT * INTO #Inserted FROM Inserted --更新的数据
SELECT * INTO #Deleted FROM Deleted --更新前的数据
--中间处理数据用
CREATE TABLE #Temp(
f_PKVal varchar(254) not null primary key, --主键
f_OldVal varchar(254), --原来的值
f_NewVal varchar(254) --新的值
)
SET @i = 0 --循环整个分段(也就所有的字段)
WHILE @i < @iSegment
BEGIN
--8个字段为一个分区,当表的列数大于8,那么计算被更新过的字段的十六进制值方法不同
IF @iColCnt < 9 --表的列数小于8
SET @iVal= COLUMNS_UPDATED()
ELSE --表的列数大于8
SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)
--等于零,则表示当前小节所对应的8个字段没有被更新(修改)过,中止本次循环,继续下一次循环
IF @iVal = 0
BEGIN
SET @i = @i + 1
CONTINUE
END
WHILE @iVal > 0
BEGIN
SET @j = 0
SET @iLog2 = @iVal / 2 --被更新字段十六进制值除2得余数
WHILE @iLog2 > 0
BEGIN
SET @j = @j + 1
SET @iLog2 = @iLog2 / 2
END --end @iLog2 > 0
-- 得到被Update 的 列ID
SET @iColId = 8 * @i + @j + 1
-- 将Update列名 赋予 @sColName
SELECT @sColName = S.name FROM Inserted as I,Deleted as D,Syscolumns as S WHERE I.F_id = D.F_id
AND S.id = object_id(@sTable)
AND S.colid = @iColId
Truncate table #Temp
--拼成功能语句
SET @sSQL = 'INSERT INTO #Temp (f_PkVal, f_OldVal, f_NewVal) ' +
'SELECT Convert( varchar(200), I.' + @sPkName + '), ' +
'Convert( varchar(200), D.' + @sColName + '), ' +
'Convert( varchar(200), I.' + @sColName + ') ' +
'FROM #Inserted as I, #Deleted as D ' +
'WHERE I.' + @sPKName + ' = D.' + @sPKName +
' AND I.' + @sColName + ' <> D.' + @sColName
EXEC(@sSQL) --执行sql
-- 测试输出
Select f_pkVal, @sColName as f_column_name, f_oldVal, f_newVal FROM #temp
-- 实际上用将信息处理后插入消息表
/**//**//**//*
..
INSERT INTO T_Message(.)
SELECT 要组成的内容
FROM #temp
*/
SET @iVal = @iVal - Power(2, @j)
END -- end @iVal > 0
SET @i = @i + 1
END -- end @i < @iSegment
DROP TABLE #Inserted
DROP TABLE #Deleted
DROP TABLE #Temp
go
select from Syscolumns as S object_id('t_test')
SELECT s.name ,s.colid FROM syscolumns as s WHERE id = object_id('t_test') and s.colid = 1
Update T_test Set f_datetime = getdate(), f_float = 0.0123, f_int= 1 where f_id = 2
这样还真行,很高兴又学到了一招,:)这样很有意思,也有挑战性。
基礎知識:
COLUMNS_UPDATED()是一個僅可在 Insert or Update trigger 中調用的方法.
該方法返回 一個 varbinary 的值, 存儲了當次Insert 或是 Update 觸發器所對應的記錄在哪些字段上發生了Inserted or updated.在SQLSERVER 的聯機幫助[CREATE TRIGGER]和[IF UPDATE] 中 有對 COLUMNS_UPDATED () 方法的簡要描述.
发表评论
-
osql 用法
2010-04-14 13:58 1039osql -U sa -P sa -S 192.168.1.5 ... -
备份数据库SQL
2009-01-08 10:52 1048SET QUOTED_IDENTIFIER ON GO SE ... -
动态交叉表
2008-09-02 16:31 740在开发项目过程中经常要用到交叉表,方便用户查看数据,交 ... -
SQL Server 收缩事务日志
2008-07-26 10:00 772BACKUP LOG DB_Name WITH TRUNCA ... -
(SQL)同一列的多行字符串数据怎么转换成同一列的一行数据?
2008-02-29 16:04 3039同一列的多行字符串数据用SQL怎么转 ... -
系统性能优化过程.
2008-01-31 22:11 1591现在的公司的系统很不稳定,尤其在高峰期间,一个系统的性 ... -
Sql错误代码14274
2008-01-30 11:26 1462在删除作业的时候出现如下的错误提示:错误1427 ... -
CPU使用率不高,内存怎么使用率也不高,但系统假死了
2007-03-19 09:20 8619在一个企业中待两年多了,遇到各种问题,很多都没有经验,只能考自 ... -
sqlserver中,sql编程的几个小常
2005-09-06 09:31 1210sqlserver中,sql编程的几个小常 ... -
得到表的字段名
2005-09-06 09:31 1228SELECT s.name ,s.colid FROM sy ... -
生成唯一值
2005-09-06 09:32 1407NEWID()创建 uniqueidentifier 类型的唯 ... -
sql server 远程引用
2005-09-06 09:51 1162在sql server 中能远程查询更新数据(OPENDATA ... -
sql server 链接服务器
2005-09-06 09:53 1724sql server 链接服务器: 创建一个链接的服务器,使其 ... -
sql一些常用的方法
2005-09-08 16:26 11171:执行另一服务器上的存储过程exec OPENDATA ... -
提高查询数据的性能历险记
2005-12-07 15:36 1017... -
sql server备份数据库
2006-01-11 11:11 1388数据是企业的重要信息,可能也是商业机密.所以我们一 ... -
[转载]SQL 过程的性能: 提示和技巧
2006-01-24 10:35 800http://www-128.ibm.com/develope ... -
"无法解决 equal to 操作的排序规则冲突"?
2006-02-14 16:08 2107在sql server 2000 下 运行关联表的sq ... -
对链接的服务器运行分布式事务处理时出现错误
2006-05-10 10:13 1614运行程序出现了如下的错误: ja ... -
SQL Server 不存在或拒绝访问
2006-10-03 14:28 1961由于国庆全公司都放假了,所以服务器,电源都停止 ...
相关推荐
--求那些人的薪水是在平均薪水之上的。 61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno); --查询每个...
9 保持字段名和类型的一致性 9 仔细选择数字类型 9 删除标记 10 避免使用触发器 10 包含版本机制 10 给文本字段留足余量 10 列[字段]命名技巧 10 第 3 部分 - 选择键和索引 11 数据采掘要预先计划 11 使用系统生成的...
触发器实现的主键生成器(Primary keys assigned by triggers) 6.1.5. composite-id 6.1.6. 鉴别器(discriminator) 6.1.7. 版本(version)(可选) 6.1.8. timestamp (optional) 6.1.9. property 6.1.10. ...
16.4. 定制SQL用来create,update和delete 16.5. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML...
17.4. 定制SQL用来create,update和delete 17.5. 定制装载SQL 18. 过滤数据 18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据进行工作 19.1.1. 指定同时映射XML和类 19.1.2. 只定义XML映射 ...
16.4. 定制SQL用来create,update和delete 16.5. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML...
17.4. 定制SQL用来create,update和delete 17.5. 定制装载SQL 18. 过滤数据 18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据进行工作 19.1.1. 指定同时映射XML和类 19.1.2. 只定义XML映射 19.2. ...
触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对...
16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML...
16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML...
可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、浏览数据、在对象...
对象浏览器——可配置的树形浏览能够显示同PL/SQL开发相关的全部信息,使用该浏览器可以获取对象描述、浏览对象定义、创建测试脚本以便调试、使能或禁止触发器或约束条件、重新编译不合法对象、查询或编辑表格、...