关于SQL Server数据库项目

什么是SQL Server数据库项目

可以直接在Visual Studio上创建数据库以及更新现有数据库的应用程序,可以对数据库进行版本控制,所采用的方式跟我们托管代码几乎一样。

团队成员可以能够签出文件,在独立的开发环境(或沙盒)中进行更改、生成和测试。

为了确保代码质量,还可以产生临时环境中特定的数据库版本完成和测试并部署到生产环境中。

所有这一切都在vs sql server database project项目中完成,甚至连开sql server managerent studio变得更少。

创建SQL Server数据库项目

在VS中可以找到SQL Server->SQL Server Database Project。

a1

项目属性可以调整我们部署的SQL Server版本。

a2

导入现有数据库。

右击项目,选择导入,有三种导入方式。

Data-tier Application:又叫DAC,这是SQL SERVER 2008 R2以上才有的,用于数据库管理。原则上DAC和SQL Server数据库项目是搭配使用,但我这里是针对后者。

Database:可以选择现有数据库,并自动生成所有项到项目中。

Script:即*.sql脚本。

完成导入后会看到一个完整的目录结构,包括:表、存储过程、视图。我们看到的全是一些*.sql文件。

发布SQL Server数据库项目

一但我们创建好表等后,我们可以直接发布,如同我们发布Web项目一般。

a3

指定相应不同的目标数据库,就可以部署到相应的环境当中。并且我们可以将这些发布配置保存到项目中,以后直接双击项目的发布文件可以直接发布。

每个*.sql文件都有对应的生成动作,包括:
1.None:不参与。
2.Build:参与编译。
3.PostDeploy:发布后执行。
4.PreDeploy:发布前执行。

有了这些我们可以做更多的事情,比如:数据库升级或数据初始化时的一些修正。

VS中的sql文件

  • 任意一个sql文件都可以直接右击执行、执行调试。
  • 重命名变量,这对重构时非常有用。
  • 插入代码片断,提高开发效率。

结构比较

右击项目可以创建一个结构比较,找出差异:

a4

以上。

SQL2005的CLR开发

在看如何做之前我要先说明一点理论的事,原因是为了整体了解CLR在SQL2005中是怎么一个情况,我知道绝大部分做开发都讨厌理论。

CLR与SQL2005数据库引擎关系

实际上CLR是寄生在SQL2005数据库引擎里面的,这也说明了相比较DB2和ORACLE与.NET集成相比更加有优势。SQL2005数据库引擎可直接对CLR进行例如:内存管理、线程、垃圾回收。而与其他产品DB2或ORACLE的CLR是使用外部进程,这意味着CLR与SQL2005数据库引擎会竞争系统资源。

启用CLR支持功能

默认是关闭状态,运行下面可开启:

sp_configure 'show advanced options', 1 GO RECONFIGURE GO sp_configure 'clr enabled', 1 GO RECONFIGURE GO

开发.NET数据库对象,大概需要以下这么一些步骤:

  1. 用VS创建你所熟悉语言的SQL SERVER项目。
  2. 编辑成DLL。
  3. 将DLL注册到SQL2005中。

大概可以创建包括:存储过程、触发器、聚合、用户自定义函数、用户自定义类型这么一些CLR数据库对象。

支持正则表达式函数创建示例

让SQL2005支持正则表达式经常看到有人这么问的,我就做这么一个示例好了,我这里是VS2010和SQL2005环境:

  1. 新建Visual C# SQL CLR数据库项目。
  2. 添加一个“用户自定义函数”类,命名:Regex
[Microsoft.SqlServer.Server.SqlFunction]    public static SqlString Regex(SqlChars input, SqlString pattern)    {        Regex regex = new Regex(pattern.Value);        return regex.Match(new string(input.Value)).Value;    }

最后右击项目-部署。

此时你就可以在你创建CLR数据库项目时指定的数据库下:可编程性-函数-标量值函数找到dbo.Regex

调用方式:

SELECT dbo.Regex('a0001', N'[a-z][0-9]{4}') FROM [Table]

MS SQL 2005 数据库BIT取反几种办法

平台:MS SQL 2005

一直以来对数据记录总会加入一些开关,而SQL 2005数据库的BIT是最佳选择,他只有两种状态相当于一个简单的逻辑关系。相比update tablename set state=1或update tablename set state=0,而逻辑关系有原因,可以直接用取反方式,下面会列出几种取反方法:

1、case when

update tableName set state=(case state when 0 then 1 when 1 then 0 else 0 end)

看起来很臃肿喔,其实就是简单的一个if语句的判断。

2、abs(绝对值)

update tableName set state=abs(state-1)

这看起来简洁一点,这种办法只是利用简单数学效果,但是说真的相比IF判断简洁许多。

3、~(按位非)

将某个给定的整型值转换为二进制表达式,对其执行按位逻辑非运算。这很符合我们取反的逻辑关系,因此我们可以这样:

update tableName set state=~state

“SQL Server 不存在或访问被拒绝”另一解决办法

原一旧网站访问量越来越大,所以就新增一台做为数据库服务器来使用(ASP和SQL2000数据库),一开始都很顺序,包括企业管理器也能够连接到新数据库上。当然这一切我非常开心。可是到后来就发生这么一个情况:

为了检查是否可以正常连接数据库,除了用企业管理器连接正常外,还特意用.NET写了一个测试工具,这一切看起来似乎非常顺利。然而考虑到ASP的连接字符串跟:企业管理器、.NET都是有差别的,我就尝试写了简单ASP测试文档:

DRIVER={SQL SERVER};server=192.168.1.110;Uid=db;pwd=21!@#34;database=dbname

对于网上很多人说尝试换不同数据库连接字符串,这点我倒认为:如果没有提示不支持该驱动模式之类的话,足以说明你的连接字符串是不成问题的。上面的连接字符串就是提示:SQL Server 不存在或访问被拒绝,我很坚信这么简单的逻辑问题,于是我没考虑更换新的连接串。当然以上都已经确保:TCIP/IP、防火墙、登录方式等都已经是正常配置,至少此时我现想不到还有哪个地方出问题。

也许我得重新整理一下我的思维:安装SQL SERVER 2000 》 配置数据库 》移植数据》非ASP测试正常,这看起来没有任何问题。

难道是权限问题?

因为在其他环境下都可以正常访问,我就排除权限这个问题。

也许我只能从安装开始,看看是否我哪里配置错误等等之类的。

运气告诉我,我的选择是对的,正因为安装非常顺序,所以特意先看一下当前数据库版本,发现原来装的是RTM版,好吧,如果我记得没错的话SQL SERVER 2000最新是SP4补丁,好吧,我先打上补丁再说。

对,没错就是因为版本的问题倒置我无法连接。可为什么呢?我查阅一些资料,始终也没有一个答案,但是在安装补丁时有个更新驱动程序,或许就是驱动程序的关系。问题解决了,可原因还是模棱两可的,就暂且一笔吧。也许他也可以帮忙你找到一点灵感。

怎么删除SQL Server日志

做法一

原本在GOOGLE上找到一段非常长的清除办法,实际也就是通过DBCC SHRINKDATABASE来收缩数据文件、日志,但是收缩数据时并不会保存索引中的碎片,反而会增加碎片,估如果压根收缩数据文件时最好是在你做了一次数据量大的表后,这样会有好处,否则不建议这么做。另在基于行版本控制的隔离级别下运行的事务可能会阻塞收缩操作。

做法二

  1. 将数据库模式设置为:简单模式。
  2. 对数据库进行收缩,主要是收缩日志。
  3. 重新改回:大日志模式,这样可以保证发生异常时日志可做为恢复依据。

两种做做法各有千秋,做法一针对数据文件、做法二针对日志文件。

SQL Server 维护计划

维护计划在数据库起到非常重要作用,每天做数据库备份、每周做索引重组、可能你可以想到更多的事,以下是我某项目中遇到问题的一些总结:

1、索引问题

“无法重新组织表 “表名” 的索引 “NC_index” (分区 1),因为已禁用页级锁定。”,其实只要启用有错误索引的“在访问索引时使用页锁”就可以解决问题。

2、执行T-SQL语句

当你执行某段T-SQL时你会发现他怎么老是找不到某个表或者其他等等错误,而当SQL代理执行时实际上默认是在master表,所以最好在T-SQL加上USE。

3、长T-SQL语句

把他当成一个存储过程不就行拉。哈哈~~~~~

© 2017 卡片机色彩 沪ICP备13032872号-3

Theme by cipchk

to top