Archive for ‘MS SQL’ Category
数据库设计首要任务之一是选择数据库的字符集,因为这关系到你的数据是以什么编码存储的,你的数据库支持什么语言等等….
1.什么是字符集(Character Set)
所谓字符集,顾名思义就是将一组字符,比如:文字字符,象形文字,符号,标点符号,控制符等通过一定的编码组成一个集合。不同的字符集有不同的编码方式,比如最常见的是ASCII,ZHS16GBK等等,它们的编码方式不一样,所包含的字符也不一样。
不同的字符集不仅决定你的数据库支持什么样的语言,还同时影响你:
1).如何创建你的数据库对象
2).如何开发你的应用程序来处理字符数据
3).数据库如何跟操作系统进行工作
4).数据库性能
5).存储数据所需的空间
CREATE procedure ListUserPermission
(@UserName sysname)
AS
set nocount on
BEGIN
if (select object_id(’tempdb..#tt’)) is not null
drop table #tt
create table #tt
(owner sysname,
object sysname,
grantee sysname,
grantor sysname,
protecttype varchar(10),
actionname varchar(20),
columnname sysname
)
insert #tt execute sp_helprotect @username = @UserName
select
rtrim(protecttype) + ‘ ‘ + actionname + ” +
case object when ‘.’ then ” else ‘ on ‘ + ‘['+owner+'].['+object+']‘ +
case when columnname in(’(All+New)’,’(All)’,’(New)’,’.’) then ” [...]
今天一同事在安装SQL SERVER时出现如下错误:
以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机
之前也碰到过类似的问题,解决方式是:
打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目
然后再执行安装就可以了
今天部门经理问我如何截断SQL SERVER的日志文件,刚好之前有做过,如下:
1。DBCC SHRINKFILE (DataFil1, 7): 其中datafil1为你要收缩的日志文件名,或者用文件号去代替,一般日志文件号问2, 7为你要收缩到的大小,这里是7MB
2。backup log database_name with no_log
3。设定database的recovery mode为simple,但这种方法是永久性的,且已经增长的日志没办法立即截断
今天在SQL Server中attach数据库时出现如下错误:
错误5173 不能使文件与不同的数据库相关
该问题可以尝试用如下步骤解决:
1.新建一个同名的数据库
2.再停掉sql server(注意不要分离数据库)
3.用要附加的数据文件覆盖掉这个新建的数据库
4.再重启sql server
5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)
USE MASTER
GO
SP_CONFIGURE ‘ALLOW UPDATES’,1
GO
RECONFIGURE WITH OVERRIDE
GO
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME=’置疑的数据库名’
Go
sp_dboption ‘置疑的数据库名’, ’single user’, ‘true’
Go
DBCC CHECKDB(’置疑的数据库名’)
Go
update sysdatabases set status =28 where name=’置疑的数据库名’
Go
sp_configure ‘allow updates’, 0
GO
reconfigure with override
Go
sp_dboption ‘置疑的数据库名’, ’single user’, ‘false’
Go
6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用数据库的脚本创建一个新的数据库,并将数据导进去就行了.
今天一同事在用SQL Server的OPENROWSET函数从Excel中导数据到SQL Server时出现中文数据变成NULL,其语句是这样的:
select a.* from OPENROWSET(’Microsoft.JET.OLEDB.4.0′,
‘Excel 8.0;Database=c:\students.xls;’,
‘SELECT * FROM [sheet1$]‘) as a
执行结果如下:
学籍管理 F2 [...]
今天在北京上学的侄子问了我一个问题:SQL SERVER中如何用SQL语句给表的栏位加注释
关于注释这个问题,之前没用SQL语句去添加过,都是在Enterprise Manager里面添加的:(
查了一下资料,得知Microsoft在SQL Server™ 2000中引入了扩展属性,用户可在各种数据库对象上定义这些属性。这些扩展属性可用于存储与数据库对象有关的应用程序或站点特有的信息。
可以用sp_addextendedproperty将新扩展属性添加到数据库对象中。如果属性已经存在,则过程失败。
用法如下:
sp_addextendedproperty
[ @name = ] { ‘property_name’ }
[ , [ @value = ] { ‘value’ }
[ , [ @level0type = ] { ‘level0_object_type’ }
, [ @level0name = ] { ‘level0_object_name’ }
[ , [ @level1type = ] { ‘level1_object_type’ }
, [ @level1name = ] { ‘level1_object_name’ }
[ , [ @level2type = ] { [...]
问题:
Sql server数据库中一table的一个栏位每天会被update,如何查能查到是哪个程序做的?
SQL Server中可用sql trace去跟踪,但只能跟踪目前的session,所以只能写一Trigger去记录当时的情况(对于 oracle 来说可以用logminer去分析归档日志来实现,当然也可以写Trigger去实现),测试如下:
创建测试表并添加测试数据:
CREATE TABLE TR_TEST
(Id INT,
FullName VARCHAR(20)
)
INSERT INTO TR_TEST
VALUES(1,’BrightWen’)
INSERT INTO TR_TEST
VALUES(2,’HONGSU’)
创建Log表:
CREATE TABLE TR_TESTLOG
[...]
COLUMNS_UPDATED()
是一个仅可在 Insert or Update trigger 中调用的方法.
该方法返回 一个 varbinary 的值, 存储了当次Insert 或是 Update 触发器所对应的记录在哪些字段上发生了Inserted or updated.
COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。
可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。
COLUMNS_UPDATED返回值varbinary的算法:
COLUMNS_UPDATED()方法返回的 varbinary,是以每个小节存储8个字段(的修改状态)的方式记录了当前触发器所有列的修改情形.
因此程序以8个字段为一片段来循环处理所有字段.
SET @iVal= SubString(COLUMNS_UPDATED(), @i + 1, 1)
其中@i:
如果前8列,@i =1
9-16列,@i =2
17-24列,@i = 3
以次类推
程序用上面语句将一小节转化为整型.
测试发现:
当@i=1:
当且仅当这一小片只有一个字段有修改时
1,@iVal = 1 = 2^(1-1);
2,@iVal = 2 = 2^(2-1);
3,@iVal = 4 = 2^(3-1);
4,@iVal = [...]