最近做了三个问题,虽然很小,而且实现的也略显笨拙,但还是想记录下来,供大家参考一下,也满足一下自己的一种虚荣心,呵呵:)
问题一:
要求对一表中的字符数据进行自动编码,基本要求大概是:第一条数据编码为'FM00000',第二条为'FM00001',第三条为"FM00002',以次类推;刚好最近在练习写触发器,简单实现了一下.
实现思路:
建立主键为identity的表,利用表主键的identity属性,在触发器中拼成所需字符串,当向表insert数据时更新相应字段值
--建表
CREATE TABLE [dbo].[test_table] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[NAME] [varchar] (80)
) ON [PRIMARY]
GO
--建立触发器
CREATE trigger test_trigger on test_table
for insert
as update test_table
set name =substring('FM'+stuff('00000',5-len(i.id)+1,len(i.id),CAST(i.id AS char(5))),1,7)
from inserted i where i.id=test_table.id
GO
--测试插入语句
insert into test_table select 1 union select 2 union select 3 union select 4 union select 5
如不使用identity的字段上面的触发器也可以做修改,如下:
alter trigger test_trigger on test_table
for insert
as
declare @next_seq int
select @next_seq=(select cast ((select substring(max(name),3,5) from test_table) as int)+1)
update test_table
set name =substring(stuff('FM00000',7-len(@next_seq)+1,len(@next_seq),cast(@next_seq as char(5))),1,7)
--或者如此,这样更简单:
-- set name ='FM'+right('00000'+cast(@next_seq as varchar),5)
from inserted i where i.id=test_table.id
GO
问题二:
查询中实现对价格等货币值格式化为$0,000.00样式的问题,实现如下:
货币转换:
select '$'+convert(varchar,cast(tb字段 as money),1)
示例: select '$'+convert(varchar,cast(111111.5 as money),1)
问题三:
编写触发器,对一表中插入的日期数据修改为该日期所处月份的最后一天
脚本如下:
--建测试表
create table test_table (
id int IDENTITY(1,1) primary key,
mytime datetime NOT NULL)
GO
--建触发器
create trigger date_change_trigger on test_table
for insert
as
update test_table
set mytime = (select dateadd(ms,-3,dateadd(m,datediff(m,0,(select mytime from inserted))+1,0)))
from inserted i where test_table.id=i.id
GO
SQL Server 中易混淆的数据类型
近来在做数据库设计,有时候真弄不清SQL2000里的数据类型,所以摘了这篇文章。
(1)char、varchar、text和nchar、nvarchar、ntext
char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据。所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;而变长字符数据则不会以空格填充。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
后面三种数据类型和前面的相比,从名称上看只是多了个字母"n",它表示存储的是Unicode数据类型的字符。写过程序的朋友对Unicode应该很了解。字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较:nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
(2)datetime和smalldatetime
datetime:从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之三秒。
smalldatetime:从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。
(3)bitint、int、smallint、tinyint和bit
bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型数据。
int:从-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型数据。
smallint:从-2^15(-32,768)到2^15-1(32,767)的整数数据。
tinyint:从0到255的整数数据。
bit:1或0的整数数据。
(4)decimal和numeric
这两种数据类型是等效的。都有两个参数:p(精度)和s(小数位数)。p指定小数点左边和右边可以存储的十进制数字的最大个数,p必须是从 1到38之间的值。s指定小数点右边可以存储的十进制数字的最大个数,s必须是从0到p之间的值,默认小数位数是0。
(5)float和real
float:从-1.79^308到1.79^308之间的浮点数字数据。
real:从-3.40^38到3.40^38之间的浮点数字数据。在SQL Server中,real的同义词为float(24)。
最近我在为公司的框架程序(以数据应用为导向的应用体系)做数据管理模块,这个模块的需求比较简单:备份、恢复和清理日志。我公司的软件基本上以C/S为基本架构,所以数据管理模块中两个主要的功能‘备份与恢复’都可能会在Client端操作,备份与恢复’的文件也都有可能存储在client端,因而这个数据管理模块就必须能够实现在远程备份与恢复数据库。
文章的前提阐述完了,就该说说如何具体实现吧。其实都很简单,我想写个远程备份的测试实例
给大家看,就能够很清楚的描述吧!
实例说明:
环境:win2k+sqlserver 2K+查询分析器
SQLSERVER服务实例名称:mainserver
需要备份的数据库名称: msdb
本地机器名称(Client端):david
本地用户:zf 密码:123
本地域名:domain
本地提供备份需求的文件夹:e:\test
第一步: 建立共享文件夹
在程序代码中调用(或者CMD窗口) net share test=e:\test
或者用NetShareAdd这个API
简要说明:
net share : 是WINDOWS内部的网络命令。
作用:建立本地的共享资源,显示当前计算机的共享资源信息。
语法:参见 net share /?
第二步: 建立共享信用关系
master..xp_cmdshell 'net use \\david\test 123 /user:domain\zf'
简要说明:
1:xp_cmdshell :是SQLSERVER的扩展存储过程。
作用,以操作系统命令行解释器的方式执行给定的命令字符串,
并以文本行方式返回任何输出。
语法:参见SQLSERVER联机帮助
2:net use : 是WINDOWS内部的网络命令。
作用,将计算机与共享资源连接或断开,或者显示关于计算机
连接的信息。该命令还控制持久网络连接。
语法:参见 net use /?
第三步:备份数据库
backup database msdb to disk='\\david\test\msdb.bak'
这个不需要说明吧,语法参见SQLSERVER联机帮助
第四步: 删除共享文件夹
在程序代码中调用(或者CMD窗口) net share test /delete
或者用NetShareDel这个API
结果:
已处理 1376 页,这些页属于数据库 'msdb' 的文件 'MSDBData'(位于文件 1 上)。
已处理 1 页,这些页属于数据库 'msdb' 的文件 'MSDBLog'(位于文件 1 上)。
BACKUP DATABASE 操作成功地处理了 1377 页,花费了 3.653 秒(3.086 MB/秒)。
这样mainserver服务器上的msdb就备份到了david机器的E:\test\msdb.bak文件了,使用起来很简单吧?恢复数据库操作也是一样,只要将第三个步骤的语句改为'restore database msdb from disk='\\david\test\msdb.bak'就可以啦。。你看完了也可以试试呀?!(最简单的测试工具查询分析器+CMD窗口)
备注:xp_cmdshell 这个扩展存储过程只能SA级别的用户调用,而且是SQLSERVER的安全隐患之一,许多DBA都喜欢将其删除或者禁用,所以开发人员使用时要倍加小心哦。
文章中的例子只是简要的说明了应如何利用扩展存储过程实现远程备份与恢复,没有涉及安全以及其他方面的考虑,希望读者在代码中自行完善。
这个是我找到了的作者Blog:http://blog.csdn.net/aloesky/的原文,有兴趣可以看一下,我测试过了,这种方式实现可以,不过存在弊端: 这种方式好像不能跨网段备份。