Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

MSSQL中没有直接的如SUM一样的乘积函数,不过可通过变换得到。
由log(a) + log(b) + loa(c) = log(a*b*c) 得到:
a*b*c = exp(log(a) + log(b) + loa(c)) (exp:e的指数, 如EXP(10) = e^10 ),
因log(a) + log(b) + loa(c)可以通过加法得到,故乘积也可得到。

如下:
select EXP(sum(LOG(quantity))) from(
select 1 quantity
union select 2
union select 3
union select 4
union select 5
)m


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

为防止分母中出现0,可用NULLIF与0做判断,若等于0,则返回NULL,任何数与NULL运算都为NULL,否则,返回原值。
declare @i int
set @i = 0
select(2/nullif(@i,0)


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

SQL Server在启动或运行过程中遇到的问题,都会在日志文件有记录,
日志文件地址:\MSSQL.X\MSSQL\LOG目录下,默认保留7天的日志,每次SQL Server重启,
都会新建一个errorlog文件,原errorlog文件更改为errorlog.1,原errorlog.1改为errorlog.2,依次类推。
1,从注册表读取SQL Server启动信息,如启动参数,网络配置信息等。
2,检测硬件,配置内在及CPU
3,初始化MS DTC
4,系统数据库启动,顺序:master,mssqlsystemresource,model和tempdb,只要其中之一不能启动,SQL Server启动就会失败。
5,准备网络连接:TCP/IP,Shared Memory等。
6,在此步前,SQL Server服务已可用,接下来会启动msdb数据库和其他用户数据库。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

DBCC SHRINKFILE收缩的是区一级的数据,会将没在使用中的区进行删除。但会有许多空页分布在区内,造成区在使用,故这样的区得不到删除。
若想删除,方式是:重建聚集索引,整理页数据。
注:页是SQL Server数据存储的最基本单位,页的大小是8KB,
每区由8个页组成,这意味着SQL Server数据库中每MB有128页,16个区。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

实例:将数据库系统在一台新服务器上恢复
下面是参考步骤。请注意,在命令行下运行的指令,是大小写敏感的。
1. 确认备用服务器的SQL Server版本和原服务器一致。
因为我们需要恢复系统数据库,需要保证我们恢复的master和msdb要能够和备用机的resource数据库一致。否则SQL Server将不能正常工作。所谓版本一致,指的是“select @@version”返回的号码必须完全一样。

2. 在备用服务器的命令行窗口,用指令以单用户模式启动SQL Server服务。
NET START MSSQLSERVER /m

命令如果成功执行,应该返回如下信息:

The SQL Server (DR) service is starting..
The SQL Server (DR) service was started successfully.

3. 在命令行窗口,用sqlcmd这个命令行工具连接SQL Server。
sqlcmd -E -S sql2005pc

如果连接成功建立,应该返回下面的信息。

1>

4. 首先恢复Master数据库。
4.1 在sqlcmd的那个连接里,运行下面恢复语句(假设备份文件为’c:\lab\master.bak’)。
restore database master from disk = ‘c:\lab\master.bak’
go

它应该返回类似于下面的信息:

Processed 360 pages for database ‘master’, file ‘master’ on file 1.
Processed 4 pages for database ‘master’, file ‘mastlog’ on file 1.
The master database has been successfully restored. Shutting down SQL Server.
SQL Server is terminating this process.

SQL Server服务自动停止了。

4.2 由于恢复的master数据库里记载的其他数据库的路径和现在的路径不一致,这时候重新启动SQL Server会失败。必须要用trace flag 3608来启动。
net start MSSQLSERVER /f /m /T3608

如果正常,应该返回下面的信息。
The SQL Server (DR) service is starting.
The SQL Server (DR) service was started successfully.

4.3 用sqlcmd连接修改其他数据库的文件路径到现有的正确路径(’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\’)。
在命令行窗口,用sqlcmd再次作连接。

sqlcmd -E -S sql2005pc

用下面语句修改各个系统数据库的文件路径。

alter database mssqlsystemresource modify file (name =data, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\mssqlsystemresource.mdf’);
go

如果正常,应该返回下面的信息。
The file “data” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database mssqlsystemresource modify file (name =log, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\mssqlsystemresource.ldf’);
go

如果正常,应该返回下面的信息。
The file “log” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database msdb modify file (name =MSDBData, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdbdata.mdf’);
go

如果正常,应该返回下面的信息。
The file “MSDBData” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database msdb modify file (name =MSDBLog, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdblog.ldf’); go

如果正常,应该返回下面的信息。
The file “MSDBLog” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database model modify file (name =modeldev, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\model.mdf’);
go

如果正常,应该返回下面的信息。
The file “modeldev” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database model modify file (name =modellog, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf’);
go

如果正常,应该返回下面的信息。
The file “modellog” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database tempdb modify file (name =tempdev, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\tempdb.mdf’);
go

如果正常,应该返回下面的信息。
The file “tempdev” has been modified in the system catalog. The new path will be used the next time the database is started.

alter database tempdb modify file (name =templog, filename=’C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\templog.ldf’);
go

如果正常,应该返回下面的信息。
The file “templog” has been modified in the system catalog. The new path will be used the next time the database is started.

全部修改完毕后,运行“exit”命令退出sqlcmd连接。

4.4 关闭SQL Server。
net stop MSSQLSERVER

如果正常,应该返回下面的信息。
The SQL Server (DR) service is stopping.
The SQL Server (DR) service was stopped successfully.

4.5 用正常模式启动SQL Server。
net start MSSQLSERVER
这时,SQL Server可以正常启动。但是它使用的系统数据库除了master以外,都是原先备用服务器自己的。我们要用生产服务器上的备份来替换它们。

5. 恢复msdb.
在运行下面命令之前,要先关闭SQL Server Agent服务。然后用restore命令恢复mdsb,将其指向新的文件路径。
restore database msdb from disk = ‘c:\lab\msdb.bak’
with move ‘MSDBData’ to ‘C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdbdata.mdf’,
move ‘MSDBLog’ to ‘C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\msdblog.ldf’, replace

如果正常,应该返回下面的信息。
Processed 600 pages for database ‘msdb’, file ‘MSDBData’ on file 1.
Processed 7 pages for database ‘msdb’, file ‘MSDBLog’ on file 1.
RESTORE DATABASE successfully processed 607 pages in 0.841 seconds (5.907 MB/sec).

6. 恢复model.
restore database model from disk = ‘c:\lab\model.bak’
with move ‘modeldev’ to ‘C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\model.mdf’,
move ‘modellog’ to ‘C:\Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\Data\modellog.ldf’, replace

如果正常,应该返回下面的信息。
Processed 152 pages for database ‘model’, file ‘modeldev’ on file 1.
Processed 3 pages for database ‘model’, file ‘modellog’ on file 1.
RESTORE DATABASE successfully processed 155 pages in 0.174 seconds (7.273 MB/sec).

7. 修改服务器名称
7.1 运行下面的语句你会发现,返回的还是原先的服务器名字。这时因为master是从那台机器来的。
Select @@servername

7.2 运行下面语句修改服务器名。

Sp_dropserver ‘<原先服务器名>‘
Go
Sp_addserver ‘SQL2005PC’, ‘local’
Go

7.3 重启SQL服务,再运行下面语句,就可以看到返回现在的服务器名字了。
Select @@servername
Go

做完这些操作后,原先SQL Server的所有配置都能够恢复到新的服务器上。只是用户数据库都是质疑状态,因为新服务器上没有它们的文件。接下来就可以使用前文介绍的恢复方法,将用户数据库依次恢复。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,Sys.dm_exec_connections:返回与SQL SERVER实例建立的连接的相关信息。
2,Sys.dm_exec_sessions:当前执行的会话,如查询分析器窗口就是一个会话
3,Sys.dm_exec_requests:正在执行或处于等待状态的请求。
流程:connection->session->request

SELECT DB_NAME(r.database_id) DB,
substring(qt.text,r.statement_start_offset/2,
(case when r.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else r.statement_end_offset end -r.statement_start_offset)/2
) as ‘SQL statement’,
qt.text batch,s.status,c.client_net_address,s.login_name, s.program_name,s.host_name,
s.login_time,c.connect_time,s.last_request_start_time, s.last_request_end_time,s.session_id,
s.host_process_id, s.client_version, s.client_interface_name,c.net_transport, c.net_packet_size,
r.request_id, r.start_time, r.status, r.command, r.user_id, r.blocking_session_id, r.wait_type,r.wait_time,
r.last_wait_type, r.wait_resource, r.open_transaction_count,r.transaction_id, r.percent_complete, r.cpu_time, r.reads, r.writes,r.granted_query_memory
FROM Sys.dm_exec_connections c
LEFT JOIN Sys.dm_exec_sessions s ON c.session_id = s.session_id
LEFT JOIN Sys.dm_exec_requests r ON s.session_id = r.session_id
outer apply sys.dm_exec_sql_text(r.sql_handle) as qt
ORDER BY c.client_net_address,s.login_name


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,锁发生在事务中。事务的4个属性是:原子性,一致性,隔离性,持久性。(ACID)
1)原子性:对于数据的修改,要么全部执行,要么全部不执行,不存在一部分修改而另一部分未变的情况,即使执行一半发生断电的情况,下次启动时也会读取日志将上次未完的操作执行下去(故对于事务,日志优先写入)。
2)隔离性:对于数据的修改,同一时间只能由一个事务处理
3)一致性:事务完成时,必须使所有数据都保持一致状态。
4)持久性:事务完成之后,它对于系统的影响是永久性的。

2,隔离级别:mssql通过对共享锁申请和释放机制的不同处理,实现不同事务隔离级别。
1)隔离等级:
隔离级别 是否申请共享锁 何时释放 有无范围锁
未提交读 否 无 无
已提交读 是 当前语句执行完 无
可重复读 是 事务提交时 无
可序列化 是 事务提交时 有

在事务里面:
未提交读就是你读的同时我可以读写
已提交读取就是你读时我也可以读,但你读完后我才可以写,读操作共享锁时间一直到读取结束。
可重复读:事务提交时我才能写,读操作共享锁时间一直到事务结束。
注:未提交读:允许脏读,因此一个事务可能看见其他事务所做的尚未提交的更改。
已提交读:允许事务读取另一个事务以前读取(未修改)的数据,而不必等待第一个事务完成。 数据库引擎保留写锁(在所选数据上获取)直到事务结束,但是一执行 SELECT 操作就释放读锁。 这是数据库引擎默认级别。
已提交读快照:与未提交读一样,不加锁,但在事务未提交时,不能读取刚修改的数据,而是读取事务修改前的数据。
nolock等同于未提交读
参考msdn 设置隔离级别

2)默认隔离级别是已提交读
3)设置隔离级别:
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
BEGIN TRAN

COMMIT

4)SELECT中设置NOLOCK,可以让mssql不去申请共享锁(S), 不过可能把没有提交事务的数据也显示出来,若之后事务回滚,select就会出现脏数据。

3,锁的类型:读锁(共享锁),申请修改锁(U),修改锁(X)
1共享(S):用于读取操作,如SELECT
2)更新(U):申请修改资源,做申请者登记,当资源释放时,可以第一个修改资源,它用于可更新的资源中,数据真正修改时再转化为排他锁。一次只有一个事务可以获得资源的更新锁(U 锁)。如果事务修改资源,则更新锁(U 锁)转换为排他锁(X 锁)。在已提交读级别以下(包含已提交读),因为共享锁在语句执行完之后就会释放,故先得到U锁的事务能接着转化为共享锁。在已提交读级别以上,更新锁作用不大,假设两个事务对同一资料都获取了共享锁,都执行更新操作,那么在事务结束前因都不会释放,故U锁将一直等待,转化不成排它锁进行修改,故会出现死锁。

3)排他(X):用于数据修改操作,如INSERT,UPDATE,DELETE
4)意向(I):用于建立锁的层次,一般是父层次,它有三种类型,意向共享(IS),意向排他(IX),意向排他共享(ISX)。
5)架构(SCH):包含两种类型,架构修改(Sch-M),架构稳定(Sch-S)
6)大容量更新。
7)键范围。
注:意向锁,锁定表或页,用它可以提高性能。原因:假设去桃花源景点,规定只有桃花源内无游客是,才允许下一位游客进入。现在来了一位新游客,判断是否他应该进入景点。方法有二:1,派景区管理员进入桃花源,在景区的山山水水排查,全部排查一遍,若无游客,则安排下一游客进入,若有,则下一游客等待。2,当前一游客进入时,将景区是否有游客进入状态设为TRUE,否则为False,那么当下一游客申请进入景区是,可以非常容易的判断出是否可以进入。 由这个问题知,方法2性能高一些。意向锁就相当于这个作用,当查询数据时,将数据所在的页或表设置为再用,以避免申请其他锁时的大范围判断。故知:意向锁可以提高性能,因为数据库引擎仅在表级检查意向锁,确定事务是否能安全的获取该表上的锁,而不需要检查表上的每行或每页。

8)锁与锁的申请:读与修改互斥,即若资源上现有共享锁,那么不能加排它锁,可加读锁,申请修改锁。若资源上有修改锁(X),那么不能读,也不能申请申请修改锁(U),换句话说,S锁与U锁是相互兼容的,但都与X锁不兼容。

9)可以加锁的资源分类:(1)RID,用于锁定堆上的某一行。(2)KEY:索引上的一行,或某个索引键。(3):数据页或索引页。(4):包含所有数据和索引的整个表。(5):DATABASE:整个数据库


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
TRUNCATE TABLE tmp
BEGIN TRAN 
BEGIN TRY
	INSERT INTO dbo.tmp( c1 ,c2 ,c3 )
	VALUES(1,1,1)
	SELECT 1/0
END TRY
BEGIN CATCH
	IF @@TRANCOUNT > 0 BEGIN ROLLBACK  END 
END CATCH

IF @@TRANCOUNT > 0 BEGIN COMMIT  END 
注,@@TRANCOUNT:
1)BEGIN TRANSACTION 语句将 @@TRANCOUNT 加 1。
2)ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减到 0,
但 ROLLBACK TRANSACTION savepoint_name 除外,它不影响 @@TRANCOUNT。
3)COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
SELECT  
    [Table Name] = OBJECT_NAME(c.object_id), 
    [Column Name] = c.name, 
    [Description] = ex.value  
FROM  
    sys.columns c  
LEFT OUTER JOIN  
    sys.extended_properties ex  
ON  
    ex.major_id = c.object_id 
    AND ex.minor_id = c.column_id  
    AND ex.name = 'MS_Description'  AND class_desc = 'OBJECT_OR_COLUMN'
WHERE c.object_id = object_id('repKPIByMonth')
ORDER  BY OBJECT_NAME(c.object_id), c.column_id


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

参考:Stairways to sql server replication

一,复制分发介绍。
1,文章:可订阅项,如表,存储过程,视图,函数
2,复制类型:
(1)快照复制Snapshot Replication:一般用于对于数据库的一次性的完全复制,比如备份。
每次复制工作时,就将快照文件夹的内容copy到订阅服务器上,所以要求快照文件夹需要共享,以便复制完成,
其他类型复制,如事务型,合并型,快照文件夹主要用于首次初始化订阅库使用,以便将发布数据库copy到订阅服务器上,至于是否
要设置成共享,要看订阅是推模式还是拉模式,或是推模式,即发布更新每个订阅,那么快照文件夹只需本地发布使用,故不
需要设置成共享,而在拉模式,即每个订阅去检索发布服务器,那么就要求快照文件夹为共享。注意,一般为了便于集中管理订阅,一般设置为
推模式,由发布服务器集中处理。快照生成由快照代理完成。
(2)Transactional Replication:用于主数据库向从数据库的单向复制。日志代理扫描数据库的变化,若变化的项目中有发布,那么日志代理将就将
这种变化记载到分发服务器上,然后更新到订阅。
(3)具有可更新订阅的事务性发布: 发布服务器与订阅服务器可以独立修改,会定时合并
(4)Merge Replication:可以把多个数据库中的数据进行合并后,复制到目标数据库。
注:1)重新生成快照原因:快照存储的是当时发布数据库的数据,用于建立订阅数据库并传输数据,重新生成快照的原因其中之一是为了将新的数据存储起来,以便建立新订阅时节省时间。

二,发布扮演的角色。
1,当发布建立时,会在系统库上建立一发布数据库,记录所有发布项及复制过程,另外,对于
事务型复制分发,它还会包含待同步的命令。如MSmerge_history表,存储合并历史,MSmerge_articlehistory每个订阅项的更新信息。
注:多个复制可用一个发布库
2,复制分发由代理完成,这些代理由job来体现,在推模式中,这些job都在分发服务器上,在拉模式中,订阅服务器上也有。

三,使用。
1,利用 MSmerge_history系统数据库上查看合并历史。分发订阅MSmerge_contents 插入更新记录,MSmerge_tombstone删除记录
2,数据合并过程:执行:job名称:发布-订阅,打开此job,步骤有三个,
1)合并代理启动消息:执行实际的数据同步操作,分析
sp_MSadd_merge_history @perfmon_increment = 0, @agent_id = 1, @runstatus = 1, @comments = ‘启动代理。’
执行过程是:
1,因合并复制都是在一个会话中进行,故先从MSmerge_sessions取出当前的sessionID,若无,则insert


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,什么是合并复制。
将多个节点的数据变化合并起来同步到多个节点,保证节点数据一致。
在同步表中增加字段rowguid标识更改的行ID,在表增加触发器,插入更新存rowguid入到MSmerge_contents表内,删除存放在MSmerge_tombstone表内,
引用:http://searchsqlserver.techtarget.com/tip/How-merge-replication-works-in-SQL-Server
2,合并复制如何操作。

http://www.codeproject.com/Articles/28951/SQL-Server-2005-Merge-Replication-Step-by-Step-Pro

3,合并复制相关表。

http://blogs.msdn.com/b/repltalk/archive/2010/02/23/collection-of-merge-replication-best-practices.aspx

书籍:pro sqlserver2005 replication

http://books.google.com.hk/books?id=aup_ppJfgMcC&printsec=frontcover#v=onepage&q&f=false

4,查询没有复制分发的表
SELECT type_desc,name
FROM sys.objects
WHERE name NOT IN(
    SELECT name
    FROM sysmergearticles)
AND CHARINDEX('MS',name)<=0
AND CHARINDEX('sys',name)<=0
AND CHARINDEX('_',name)<=0
AND type_desc IN('SQL_SCALAR_FUNCTION','SQL_STORED_PROCEDURE','SQL_TABLE_VALUED_FUNCTION','USER_TABLE','VIEW')
ORDER BY type_desc,name


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

–查找表约束
SELECT OBJECT_NAME(c.object_id),c.name,d.name
FROM sys.default_constraints d
JOIN sys.columns c ON d.parent_column_id = c.column_id AND d.parent_object_id = c.object_id
WHERE d.parent_object_id = OBJECT_ID(N’bdAllocateGroup’) –AND c.name = ‘msrepl_tran_version’;


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
–开连接
CREATE USER [zinnova] FOR LOGIN [zinnova]
GO
 
–开表
GRANT SELECT ON OBJECT::dbo.mdOrderStatus TO zinnova;
GO
 
–查看 SQL 2005 用户被赋予的权限
exec sp_helprotect @username = 'zinnova'
 
–查看用户角色
select DbRole = g.name, MemberName = u.name, MemberSID = u.sid
from sys.database_principals u, sys.database_principals g, sys.database_role_members m
where g.principal_id = m.role_principal_id
and u.principal_id = m.member_principal_id
order by 1, 2

–对象的取得所有权与控制的权限区别
–经测试:取得所有权的权限可以deny,而控制权限忽略deny


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,存储空间
char(36):存储空间是36个字节,
Uniqueidentifier是16个字节,原因(如:F9274DE1-322D-46FF-A5E9-20670FFF661B,每个都是16进制,共有32个,而每个16进制数可用4位表示(2^4),故guid()是128位,一个字节是8位,那么guid()共用128/8=16个字节存储):

2,Uniqueidentifier格式必须是32个16进制+4个-,那么位数少于36或者字母中出现非a-f就会报错,如
0EC75E6B-7434-485E-BCEA-2130651861DD可用Uniqueidentifier存储,但0HC75E6B-7434-485E-BCEA-2130651861DD就不行。
故在兼容性方面,char(36)可存储<=36的所有字符,而Uniqueidentifier只能存储32个16进制+4个-. 故:在现在存储空间价格便宜的情况下,在兼容方面,推荐char(36)


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

/*在修改列类型时,提示有依赖,如下。现提供AlterColumnType存储过程用来复制表依赖关系。
ALTER TABLE dbo.bmdCustomerTel ALTER COLUMN CustomerID INT
消息 5074,级别 16,状态 1,第 1 行
索引'IX_bmdCustomerTel_2' 依赖于 列'CustomerID'。
消息 4922,级别 16,状态 9,第 1 行
由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN CustomerID 失败。
*
--主键:SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='表名'

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AlterColumnType]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[AlterColumnType]
GO

/*修改列类型时,自动查找相关索引,删除再重建*/
CREATE PROCEDURE [dbo].[AlterColumnType]
@TableName VARCHAR(50),
@ColumnName VARCHAR(50),
@NewColumnType VARCHAR(1000)
AS

SELECT t.object_id,ix.type_desc,t.name TableName,IX.index_id,ix.name indexName,s.name SchemeName INTO #
FROM SYS.tables t
JOIN SYS.indexes IX ON t.[object_id] = IX.[object_id]
JOIN SYS.schemas s ON S.[schema_id] = t.[schema_id] --表架构名
WHERE t.object_id = object_id(@TableName)
AND EXISTS( --拥有此列的索引
SELECT 1 FROM sys.index_columns cl
JOIN sys.columns c ON cl.column_id = c.column_id AND c.object_id = cl.object_id
WHERE c.name = @ColumnName AND cl.index_id = ix.index_id AND cl.object_id = t.object_id )

DECLARE cur_dx CURSOR FOR
SELECT ' DROP INDEX ' + QUOTENAME(indexName) + ' ON ' + QUOTENAME(SchemeName) + '.' + QUOTENAME(TableName) --t.name,ix.name,ix.type_desc,cl.name
FROM # t

UNION ALL

SELECT ' ALTER TABLE ' + @TableName + ' ALTER COLUMN '+ @ColumnName + ' ' + @NewColumnType

UNION ALL

SELECT ' CREATE ' + type_desc collate Chinese_PRC_CI_AS_WS + ' INDEX ' + QUOTENAME(indexName) + ' ON ' + QUOTENAME(SchemeName) + '.' + QUOTENAME(TableName)
+ '(' + STUFF( --索引列,复合索引
(SELECT ',' + CONVERT(NVARCHAR(100),cl.name)
FROM sys.index_columns c
JOIN sys.columns cl ON cl.column_id = c.column_id AND c.object_id = cl.object_id
WHERE c.object_id = t.object_id AND index_id = t.index_id
ORDER BY key_ordinal
FOR XML PATH('')),
1,1,'') + ')'
FROM # t

DECLARE @sql NVARCHAR(max)
OPEN cur_dx
FETCH cur_dx INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_executesql @sql
RAISERROR('Executed:%s',10,1,@sql) WITH NOWAIT
--PRINT @SQL
FETCH cur_dx INTO @sql
END
CLOSE cur_dx
DEALLOCATE cur_dx

DROP TABLE #

/pre>


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

CREATE TABLE tmp ([USER] NVARCHAR(MAX) )
BULK INSERT tmp FROM N’C:\aaa\数据.txt’


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

脱机数据库删除后,与联机数据删除不同的一点是,它不会自动删除与数据库关联的mdf,ldf文件,即此时若建立一同名数据库,会因数据库文件已经存大而弹出错误信息


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

sp_procoption [ @ProcName = ] ‘procedure’
, [ @OptionName = ] ‘option’
, [ @OptionValue = ] ‘value’

备注
启动过程必须位于 master 数据库中,并且不能包含 INPUT 或 OUTPUT 参数。启动时恢复了 master 数据库后,即开始执行存储过程。

参数
[ @ProcName = ] ‘procedure’
为其设置选项的过程的名称。 procedure 的数据类型为 nvarchar(776),无默认值。

[ @OptionName = ] ‘option’
要设置的选项的名称。option 的唯一值为 startup。

[ @OptionValue = ] ‘value’
指示是将选项设置为开启(true 或 on)还是关闭(false 或 off)。value 的数据类型为 varchar(12),无默认值。

返回代码值
0(成功)或错误号(失败)

权限
要求具有 sysadmin 固定服务器角色的成员身份。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

EXEC GetTableScript 'frmuser'

CREATE PROCEDURE GetTableScript 
@TableName VARCHAR(50)
AS 

--To get table script
declare @Id int, @i int, @i2 int,@Sql varchar(max),@Sql2 varchar(max), @f1 varchar(5), @f2 varchar(5), @f3 varchar(5), @f4 varchar(5), @T varchar(5)
    select @Id=object_id(@TableName), @f1 = char(13) + char(10), @f2 = '    ', @f3=@f1+@f2, @f4=',' + @f3
    
    if not(@Id is null)
    BEGIN
    declare @Data table(Id int identity primary key, D varchar(max) not null, ic int null, re int null, o int not null);
    
    -- Columns
    with c as(
        select c.column_id, Nr = row_number() over(order by c.column_id), Clr=count(*) over(),
            D = quotename(c.name) + ' ' +
                case when s.name = 'sys' or c.is_computed=1 then '' else quotename(s.name) + '.' end +
                case when c.is_computed=1 then '' when s.name = 'sys' then t.Name else quotename(t.name) end +
                case when c.user_type_id!=c.system_type_id or c.is_computed=1 then ''
                    when t.Name in ('xml', 'uniqueidentifier', 'tinyint', 'timestamp', 'time', 'text', 'sysname', 'sql_variant', 'smallmoney', 'smallint', 'smalldatetime', 'ntext', 'money',
                                    'int', 'image', 'hierarchyid', 'geometry', 'geography', 'float', 'datetimeoffset', 'datetime2', 'datetime', 'date', 'bigint', 'bit') then ''
                    when t.Name in('varchar','varbinary', 'real', 'numeric', 'decimal', 'char', 'binary')
                        then '(' + isnull(convert(varchar,nullif(c.max_length,-1)), 'max') + isnull(','+convert(varchar,nullif(c.scale, 0)), '') + ')'
                    when t.Name in('nvarchar','nchar')
                        then '(' + isnull(convert(varchar,nullif(c.max_length,-1) / 2), 'max') + isnull(','+convert(varchar,nullif(c.scale, 0)), '') + ')'
                    else '??'
                    end + 
                case when ic.object_id is not null then ' identity(' + convert(varchar,ic.seed_value) + ',' + convert(varchar,ic.increment_value) + ')' else '' end +
                case when c.is_computed=1 then 'as' + cc.definition when c.is_nullable = 1 then ' null' else ' not null' end +
                case c.is_rowguidcol when 1 then ' rowguidcol' else '' end +
                case when d.object_id is not null then ' default ' + d.definition else  '' end
        from sys.columns c
        inner join sys.types t
        on t.user_type_id = c.user_type_id
        inner join sys.schemas s
        on s.schema_id=t.schema_id
        left outer join sys.computed_columns cc
        on cc.object_id=c.object_id and cc.column_id=c.column_id
        left outer join sys.default_constraints d
        on d.parent_object_id=@id and d.parent_column_id=c.column_id
        left outer join sys.identity_columns ic
        on ic.object_id=c.object_id and ic.column_id=c.column_id
        where c.object_id=@Id
        
    )
        insert into @Data(D, o)
        select '    ' + D + case Nr when Clr then '' else ',' + @f1 end, 0
        from c where NOT D IS NULL 
        order by column_id
    
    -- SubObjects
    set @i=0
    while 1=1
        begin
        select top 1 @i=c.object_id, @T = c.type, @i2=i.index_id
        from sys.objects c 
        left outer join sys.indexes i
        on i.object_id=@Id and i.name=c.name
        where parent_object_id=@Id and c.object_id>@i and c.type not in('D')
        order by c.object_id
        if @@rowcount=0 break
        if @T = 'C' 
            insert into @Data 
            select @f4 + 'check ' + case is_not_for_replication when 1 then 'not for replication ' else '' end + definition, null, null, 10
            from sys.check_constraints where object_id=@i
        else if @T = 'Pk'
            insert into @Data 
            select @f4 + 'primary key' + isnull(' ' + nullif(lower(i.type_desc),'clustered'), ''), @i2, null, 20
            from sys.indexes i
            where i.object_id=@Id and i.index_id=@i2
        else if @T = 'uq'
            insert into @Data values(@f4 + 'unique', @i2, null, 30)
        else if @T = 'f'
            begin
            insert into @Data 
            select @f4 + 'foreign key', -1, @i, 40
            from sys.foreign_keys f
            where f.object_id=@i
            
            insert into @Data 
            select ' references ' + quotename(s.name) + '.' + quotename(o.name), -2, @i, 41
            from sys.foreign_keys f
            inner join sys.objects o
            on o.object_id=f.referenced_object_id
            inner join sys.schemas s
            on s.schema_id=o.schema_id
            where f.object_id=@i
            
            insert into @Data 
            select ' not for replication', -3, @i, 42
            from sys.foreign_keys f
            inner join sys.objects o
            on o.object_id=f.referenced_object_id
            inner join sys.schemas s
            on s.schema_id=o.schema_id
            where f.object_id=@i and f.is_not_for_replication=1
            end
        else
            insert into @Data values(@f4 + 'Unknow SubObject [' + @T + ']', null, null, 99)
        end

    insert into @Data values(@f1+')', null, null, 100)
    
    -- Indexes
    insert into @Data
    select @f1 + 'create ' + case is_unique when 1 then 'unique ' else '' end + lower(s.type_desc) + ' index ' + 'i' + convert(varchar, row_number() over(order by index_id)) + ' on ' + quotename(sc.Name) + '.' + quotename(o.name), index_id, null, 1000
    from sys.indexes s
    inner join sys.objects o
    on o.object_id=s.object_id
    inner join sys.schemas sc
    on sc.schema_id=o.schema_id
    where s.object_id=@Id and is_unique_constraint=0 and is_primary_key=0 and s.type_desc != 'heap'
    
    -- columns
    set @i=0
    while 1=1
        begin
        select top 1 @i=ic from @Data where ic>@i order by ic 
        if @@rowcount=0 break
        select @i2=0, @Sql=null, @Sql2=null
        while 1=1
            begin
            select @i2=index_column_id, 
                @Sql = case c.is_included_column when 1 then @Sql else isnull(@Sql + ', ', '(') + cc.Name + case c.is_descending_key when 1  then ' desc' else '' end end,
                @Sql2 = case c.is_included_column when 0 then @Sql2 else isnull(@Sql2 + ', ', '(') + cc.Name + case c.is_descending_key when 1  then ' desc' else '' end end
            from sys.index_columns c
            inner join sys.columns cc
            on c.column_id=cc.column_id and cc.object_id=c.object_id
            where c.object_id=@Id and index_id=@i and index_column_id>@i2
            order by index_column_id
            if @@rowcount=0 break
            end
        update @Data set D=D+@Sql +')' + isnull(' include' + @Sql2 + ')', '') where ic=@i
        end
        
    -- references
    set @i=0
    while 1=1
        begin
        select top 1 @i=re from @Data where re>@i order by re
        if @@rowcount=0 break
        
        select @i2=0, @Sql=null, @Sql2=null
        while 1=1
            begin
            select @i2=f.constraint_column_id, 
                @Sql = isnull(@Sql + ', ', '(') + c1.Name,
                @Sql2 = isnull(@Sql2 + ', ', '(') + c2.Name
            from sys.foreign_key_columns f
            inner join sys.columns c1
            on c1.column_id=f.parent_column_id and c1.object_id=f.parent_object_id
            inner join sys.columns c2
            on c2.column_id=f.referenced_column_id and c2.object_id=f.referenced_object_id
            where f.constraint_object_id=@i and f.constraint_column_id>@i2
            order by f.constraint_column_id
            if @@rowcount=0 break
            end
        update @Data set D = D + @Sql + ')'  where re=@i and ic=-1
        update @Data set D = D + @Sql2 + ')'  where re=@i and ic=-2
        end;
    
    -- Render
    with x as(
        select id=d.id-1, D=d.D + isnull(d2.D,'')
        from @Data d
        left outer join @Data d2
        on d.re=d2.re and d2.o=42
        where d.o=41
        
    )
    update @Data
        set D=d.D+x.D
    from @Data d
    inner join x
    on x.id=d.id
    
    delete @Data where o in(41, 42)
    
    select @Sql = 'create table ' + quotename(s.name) + '.' + quotename(o.name) + '(' + @f1
    from sys.objects o
    inner join sys.schemas s
    on o.schema_id = s.schema_id
    where o.object_id=@Id
    
    set @i=0
    while 1=1
        begin
        select top 1 @I=Id, @Sql = @Sql + D from @Data order by o, case when o=0 then right('0000' + convert(varchar,id),5)  else D end, id
        if @@rowcount=0 break
        delete @Data where id=@i
        end
    END
    SELECT @Sql

引自:http://www.cnblogs.com/unruledboy/archive/2011/12/05/SQLMon2.html


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

视图创建之后,若表结构发生改变,此时视图是不改变的,需要刷新视图才可。
exec sp_refreshview ‘VR_bswGoods’