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 2005安装总是包括四个数据库:master、model、tempdb和msdb。还包含第五个“隐藏的”数据库Resource

1,model 数据库是 Microsoft SQL Server 创建其他数据库(包括 tempdb 数据库和用户数据库)时使用的模板。创建数据库时,model 数据库的全部内容(包括数据库选项)都会被复制到新数据库中。

2,tempdb 系统数据库是连接到 SQL Server 实例的所有用户都可用的全局资源,它保存所有临时表和临时存储过程。

3,master:账号、服务器信息,在 SQL Server 2005 中,系统对象不再存储在 master 数据库中,而是存储在 Resource 数据库中

4,Resource:Resource数据库的物理文件名为 Mssqlsystemresource.mdf,默认情况下,此文件位于 x:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Mssqlsystemresource.mdf。
SQL Server 系统对象(例如 sys.objects)在物理上持续存在于 Resource 数据库中,但在逻辑上,它们出现在每个数据库的 sys 架构中。Resource 数据库不包含用户数据或用户元数据。

SQL Server 不能备份 Resource 数据库。Resource 数据库依赖于 master 数据库的位置。如果移动了 master 数据库,则必须也将 Resource 数据库移动到相同的位置。

5,msdb,包括计划信息、备份与还原历史记录信息、邮件信息
backupmediafamily --备份文件地址
backupset         --备份操作历史
restorefile		  --还原文件地址                  --
restorehistory    --还原操作历史
--备份详细
SELECT b.database_name,b.backup_start_date,b.backup_finish_date,b2.physical_device_name
FROM backupset b
JOIN backupmediafamily b2 ON b.media_set_id = b2.media_set_id
ORDER BY b.backup_start_date DESC

sysjobs --job
sysjobhistory --job执行历史

SELECT * FROM sysjobs
SELECT * FROM sysjobschedules
SELECT * FROM sysjobsteps
--job详细
SELECT a.job_id,a.name,s.next_run_date, s.next_run_time,
s2.step_name,s2.command
FROM sysjobs a
JOIN sysjobschedules s ON a.job_id = s.job_id
JOIN sysjobsteps s2 ON a.job_id = s2.job_id

--job状态
--取出在执行的job
 exec msdb.dbo.sp_help_job @Category_Name = N'REPL-Merge',@execution_status = 1
execution_status:
1 正在执行。
2 正在等待线程。
3 在两次重试之间。
4 空闲。
5 挂起。
7 正在执行完成操作
--不过,若想将存储过程执行的结果放到一临时表中,上述存储过程将报嵌套错误,此时,应用master.dbo.xp_sqlagent_enum_jobs
exec master.dbo.xp_sqlagent_enum_jobs 1,hello  
/*p_sqlagent_enum_jobs <is sysadmin (0 or 1)>,
                        <job owner name>
                       [, <job id>]

    The first parameter identifies whether you want to return information about all jobs on the server, 
    or just jobs owned by a particular job owner. If you specify "0" for this first parameter, 
    it means you want to return job information for a particular job owner. If you specify a "1," 
    it means you want information for all jobs. The second parameter identifies the job owner. 
    This parameter is required on all calls to this XP but is only used when you specify "0" for the 
    first parameter. The third and last parameter only needs to be provided if you want to return 
    information about a particular job_id. 
*/
参考:http://www.databasejournal.com/features/mssql/article.php/10894_3491201_2/Detecting-The-State-of-a-SQL-Server-Agent-Job.htm

--开关job
msdb.dbo.sp_stop_job @job_id = 'adfsdfs-sdfsdf'
msdb.dbo.sp_start_job @job_id ='adfsdfs-sdfsdf'

sysmail_mailitems --邮件明细






Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
DECLARE @TempTable table(UserID int , UserName nvarchar(50));
insert into @TempTable (UserID,UserName) values (1,'a')
insert into @TempTable (UserID,UserName) values (1,'b')
insert into @TempTable (UserID,UserName) values (1,'c')
insert into @TempTable (UserID,UserName) values (2,'d')
insert into @TempTable (UserID,UserName) values (2,'e')
insert into @TempTable (UserID,UserName) values (2,'f')

--以XML节点式一行存数据,节点名即是列名
select UserID,UserName from @TempTable FOR XML PATH

--PATH中的内容指定根结点名称,若无,则默认为root
select UserID,UserName from @TempTable FOR XML PATH('lzy')

--指定顶级根结点名称
select UserID,UserName from @TempTable FOR XML PATH('lzy'), root ('Root')

--若结果集中无列名,那么节点名也就没有,数据就显示到了一行
select convert(varchar(50),UserName) +','? from @TempTable s WHERE s.UserID = 1

--stuff用来去掉多余的逗号
SELECT DISTINCT t.UserID,
STUFF((select ',' + convert(varchar(50),UserName)? from @TempTable s WHERE s.UserID = t.UserID FOR XML PATH('')),1,1,'')
FROM @TempTable t


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
 为结果集构造行号,实际上是为结果集指定顺序,要排序的话就要知道排序规则:Order By
如:SELECT ROW_NUMBER() OVER(ORDER BY id DESC)AS rownum,
       departname  FROM mdDepartment md
应用:mysql的limit即可使用:
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY id DESC)AS rownum,departname
FROM mdDepartment md
) AS a
WHERE a.rownum>=3 AND a.rownum<=5      --返回3到5行


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
CTE: Common Table Express 指定临时命名的结果集

1, 当sql语句比较大时,可以用CTE将小结果集拆分,以便阅读
    WITH mycre(id,name) AS ( select id ,name from mddepartment )
    SELECT * FROM frmuser JOIN mycre ON frmuser.DepartmentID= mycre.id
 注:1)CTE 之后必须直接使用,间隔sql语句就会失效
        2)在用with时并不会执行查询,只是凑sql语句,只有当with后面的select *引用cte时才会执行

2,递归使用,依次引用自身。递归 CTE 定义至少必须包含两个 CTE 查询定义(一个定位点成员和一个递归成员)
 WITH departments(id,Departname,depth) as(
    SELECT id,Departname,1 depth FROM mdDepartment md
    WHERE md.ParentID = 2   --找到广告商务部的直接子部门 定位点成员,depth指定深度
    UNION ALL
    SELECT md.id,md.Departname,depth+1 FROM mdDepartment md --找到子部门的子部门 递归成员
    JOIN departments d ON md.ParentID = d.id
   
)
SELECT * FROM departments
    注:1)定位点成员之间必须使用UNION ALL、UNION、INTERSECT、EXCEPT集合运算符,最后一个定位点成员与递归成员之间必须使用UNION ALL,递归成员之间也必须使用UNION ALL连接,定位点成员和递归成员中的字段数量和类型必须完全一致,递归成员的FROM子句只能引用一次CTE对象。
           2)递归成员中不允许出现下列项
              SELECT DISTINCT
              GROUP BY
              HAVING
              标量聚合
              TOP
              LEFT、RIGHT、OUTER JOIN(允许出现 INNER JOIN)
              子查询


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,将循环因子1,2,3,4,5....存入一表中,用此表与目标表进行关联即可。
2,例子:提取 字符串  ‘13604784785薛小姐’非中文部分
create table #tt(n int)          --循环数
declare @tt int
set @tt=1
while @tt<=200
begin
        insert #tt values(@tt)
        set @tt=@tt+1
END
CREATE TABLE #ts(tel VARCHAR(100))
INSERT INTO #ts VALUES ('13604784785薛小姐')

declare @string varchar(200)
SELECT TOP 1 *,SUBSTRING(tel,1,n-1) FROM (
SELECT tel,n,case when SUBSTRING(tel,n,1) LIKE '[0-9]' THEN NULL ELSE STUFF(tel,n,0,'#') END AS 'string'
FROM #ts JOIN #tt ON n < LEN(#ts.tel))m1
WHERE m1.string IS NOT null


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 case 1 when 1 then ‘yes’ when 2 then ‘no’ end
即为:when 1=1 取 ‘yes’
when 1=2 取 ‘no’
多条件为:
SELECT CASE WHEN 1=2 THEN 2 when 3=3 then 3 ELSE 4 end
case后不带参数,when可作多个条件

带语句使用:
–若是一次部门,输出第一次下订单日期,若是二次部门等,输出第一次分配客户日期
SELECT md.DepartName,a.UserName,CASE(md.DepartType)
WHEN ‘first’
THEN (SELECT MIN(orderdate) FROM bdOrder bo WHERE bo.SalesStaff=a.Account )
ELSE (SELECT MIN(opendate) FROM bdCustomerAllocate bca WHERE bca.SalesStaff =a.Account ) END
FROM frmuser a(NOLOCK)
JOIN mdDepartment md ON a.DepartmentId = md.ID
注: THEN 后面是一个值,故SELECT要用括号括起来。


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

@@ROWCOUNT 返回受上一语句影响的行数,如select取出的行数,(可用此判断查询是否有结果),update更新的行数。
注:@@RowCount 是全局变量,它是基于session的,每个会话有自己的全局变量,在任一时间点下@@RowCount是安全的。 也就是说它永远是返回该session前一条sql所影响的行数.


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,用case指定条件
    SELECT f.UserName,
    SUM(CASE CONVERT(VARCHAR(10),b.OrderDate,120) WHEN '2011-03-10' THEN b.Amount ELSE 0  END) AS '2011-03-10',
    SUM(CASE CONVERT(VARCHAR(10),b.OrderDate,120) WHEN '2011-03-11' THEN b.Amount  ELSE 0 END) AS '2011-03-11',
    SUM(CASE CONVERT(VARCHAR(10),b.OrderDate,120) WHEN '2011-03-12' THEN b.Amount  ELSE 0 END) AS '2011-03-12' 
    FROM bdAchievement a(NOLOCK)
    JOIN bdOrder b(NOLOCK) ON a.OrderNo = b.OrderNo
    JOIN frmuser f ON a.SalesStaff = f.Account
    WHERE a.RootDepartmentID  = 184 AND b.OrderDate >='2011-03-10'
    GROUP BY F.UserName

    2,用SQL SERVER2005提供的关键词PIVOT来执行
    行变列:将多行的值合并放到列上去,这就需要一个聚合函数,此外要指定拆分成行(列一行)的列并且此列按如何规则分配到行上去
    SELECT * FROM (
    SELECT f.UserName,CONVERT(VARCHAR(10),OrderDate,120) orderdate,b.Amount 
    FROM bdAchievement a(NOLOCK)
    JOIN bdOrder b(NOLOCK) ON a.OrderNo = b.OrderNo
    JOIN frmuser f ON a.SalesStaff = f.Account
    WHERE a.RootDepartmentID  = 3 AND b.OrderDate >='2010-02-10') O
    PIVOT (SUM(amount) FOR orderdate IN([2011-03-10],[2011-03-11],[2011-03-12],[2011-03-13])) AS c
    将列订单日期转换到行上去,分成多个列,规则是[2011-03-10],[2011-03-11],[2011-03-12],[2011-03-13]),并对要求的amount求和

    同样列变行为:UNPIVOT
注:应用限制,列拆分规则是有限的几个,即行名是可指定的,若行名是未知数,那查出的数据将不知放到哪一列,故这样的行转列是则不可执行

注: PIVOT 与CASE 方法的区别:PIVOT简洁,但只能将一个列的列值转为列,没有CASE灵活


3,将列直接转成行
现有一客户电话表,客户电话最多4个,要求以行形式显示出来

CREATE TABLE tmpTable(CustomerID INT,Tel VARCHAR(20))

INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654321')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654322')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654323')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(222,'13587654324')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(333,'13587654331')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(333,'13587654332')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(444,'13587654341')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(444,'13587654332')
INSERT INTO tmpTable(CustomerID,Tel) VALUES(444,'13587654332')

SELECT * FROM (
SELECT customerid,tel, ROW_NUMBER () OVER ( PARTITION BY CustomerID ORDER BY  tel DESC )r
FROM tmpTable tt)m
PIVOT (max(tel) FOR r IN ([1],[2],[3],[4]) ) AS t



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

VARCHAR(MAX),它的最大长度可以达到2G
注意:VARCHAR和VARCHAR(MAX)混在一起做处理时还是会变成VARCHAR,从而可能被截断,所以需要全转成VARCHAR(MAX)

DECLARE @ControlAccountS VARCHAR(MAX)
SET @ControlAccountS = ”
SET @ControlAccountS = REPLICATE(CONVERT(VARCHAR(MAX),’b’),8500)
PRINT LEN(@ControlAccountS)


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
syscomments :此表存放着存储过程的语句

 /*从链接服务器上拿到存储过程,在目标服务器上执行,可用于发布与更新*/
DECLARE @text VARCHAR(MAX),@objectName VARCHAR(100),@objectID int
DECLARE p CURSOR FOR
SELECT NAME,id FROM dpserver.brm_lvjian_new.dbo.sysobjects o
WHERE xtype IN('P') 
AND o.crdate >= GETDATE()-3
OPEN p
FETCH NEXT FROM p INTO @objectName,@objectID
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @text = ''
    SELECT @text = @text + convert(VARCHAR(MAX),text) FROM dpserver.brm_lvjian_new.dbo.syscomments s 
    WHERE id = @objectID
    IF ( EXISTS( SELECT 1 FROM sysobjects WHERE NAME = @objectName AND xtype IN('P')  ) )
    BEGIN
        --
        EXEC ('DROP PROCEDURE dbo.' +  @objectName)
    END
    EXEC(@text)
    FETCH NEXT FROM p INTO @objectName,@objectID    
END
CLOSE p
DEALLOCATE p


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
DECLARE p CURSOR for
SELECT name FROM sys.tables t
WHERE t.[type] = 'U' AND CHARINDEX('SYS',t.name) =0
ORDER BY t.name
OPEN p
DECLARE @tablename VARCHAR(50)
DECLARE @sql VARCHAR(max)
SET @sql= ''
FETCH NEXT FROM p INTO @tablename 
WHILE @@FETCH_STATUS =0
BEGIN 
    PRINT 'TRUNCATE TABLE ' + @tablename
    FETCH NEXT FROM p INTO @tablename 
END
CLOSE p
DEALLOCATE p


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

Replication方案可以分为Snapshot Replication, Transactional Replication, Peer-2-Peer Replication, Merge Replication。
Snapshot Replication:一般用于对于数据库的一次性的完全复制。
Transactional Replication:用于主数据库向从数据库的单向复制。
具有可更新订阅的事务性发布: 发布服务器与订阅服务器可以独立修改,会定时合并
Merge Replication:可以把多个数据库中的数据进行合并后,复制到目标数据库。

注:发布服务器上需要建立一个windows账号,用来对分布产生的文件进行读取与写入,同时为了利用此账号访问发布数据库,所以需要在SqlServer上创建此账号,具体是选择浏览,选择windows账号。同时为了使sql server服务可以读写分布产生的文件,要将agent服务设置为此系统账号。 而订阅服务器上也要建立一windows账号,是为了增大agent服务的权限,及对订阅数据的写操作。
一、准备工作:
1.在分发与发发数据库上建立一个 WINDOWS 用户,设置为管理员权限,并设置密码,作为发布快照文件的有效访问用户。
2.在SQL SERVER下实现发布服务器和订阅服务器的通信正常(即可以互访)。打开1433端口,在防火墙中设特例
3.在发布服务器上建立一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为SqlCopy
4.设置SQL 代理(发布服务器和订阅服务器均设置) 打开服务(控制面板—管理工具—服务) —右击SQLSERVER AGENT—属性—登录—选择“此帐户“ —输入或选择第一步中创建的WINDOWS 用户 —“密码“中输入该用户密码
5.设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置)
步骤为:对象资源管理器—-右击SQL实例—–属性—-安全性—-服务器身份验证——选“SQL Server和WINDOWS“,然后点确定
6.开启SQL Server 2005的网络协议TCP/IP和管道命名协议并重启网络服务。
7.在SQL Server中创建步骤1中对应的系统用户登陆名,作为发布数据库的拥有者(设置为dbo_owner和public)。

二、开始:
在分发服务器上建共享文件夹
1,分发服务器上,右击复制,建立分发,注意在指定快照路径时需是网络路径,如:\\192.168.16.204\sqlCopy 204为分发服务器。 若出现运行复制分发时 “由于出现操作系统错误 3,进程无法读…” 则要查看分发服务器属性中的快照与订阅服务器的快照是否指向了网络连接。
2,发布服务器上,右击复制-本地发布,建立发布
2,订阅服务器上,右击复制-本地订阅,建立发布,分发代理安全性中
在以下Windows账号下运行,此账号指订阅服务器的账号,或者选择代理
连接到分发服务器: 选择使用以下SQL Server登陆名 分发服务器所要发布的数据库拥有者的账号

发布服务器配置(在发布服务器上配置发布和订阅)
1. 选择 复制 节点
2. 右键本地发布 —-下一步———系统弹出对话框看提示—-直到“指定快照文件夹“
—-在“快照文件夹“中输入准备工作中创建的目录(指向步骤3所建的共享文件夹)——选择发布数据库——-选择发布类型——-选择订阅服务器类型——-选择要发布的对象——设置快照代理——-填写发布名称。
3. 右键本地订阅——–选择发布服务器——-选择订阅方式(如果是在服务器方订阅的话选择推送订阅反之选择请求订阅)——-填加订阅服务器——–选择代理计划(一般选择连续运行)———其余选择默认项。

注:1)
原先数据库的Release一般会分为三部分:1.表结构的变化(包括加/删表,加/删列);2.配置数据的装载(如添加新功能的配置数据);3.刷函数与存储过程脚本。
对于本项目中的Replication数据库,在Release过程中需注意以下几点:1.若新加的表需要进行Replication,除了在主数据库创建表之外,还需配置此表进行Replicate,并进行初始化。2.若要删除某处于Replication的表,需先取消此表的Replication,再在主、从库中drop此表。3.若需要加/删Replication表的列(此列不能为主键列)时,可以直接在主数据库上执行脚本,变化会自动 Replicate到从数据库。4.配置数据的装载也只需要在主数据库完成。5.函数与存储过程需要在主、从库上都进行刷新。
2)增加列、删除列不能直接在manage studio上面操作,否则出现无法对 表’frmUser’ 执行 删除,因为它正用于复制。 (.Net SqlClient Data Provider,此时要用sql语句。sql server的说明是:对表进行架构更改时必须使用 Transact-SQL ,在 SQL Server Management Studio 中进行架构更改时,Management Studio 将尝试删除并重新创建表。因为无法删除已发布的对象,所以架构更改失败。

3)参考复制分发新增表,删除表操作:http://msdn.microsoft.com/en-us/library/ms152571(v=SQL.90).aspx


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
DECLARE @iniTel VARCHAR(100),@split VARCHAR(20),@next INT,@position INT,@nextPosition int
SET @iniTel = '13737150298/15018747329'
set @iniTel=ltrim(rtrim(@iniTel))
SET @split = '/'
SET @next = 0
SET @position=1
WHILE ( @position < LEN(@iniTel) )
BEGIN
    SET @nextPosition = CHARINDEX(@split,@iniTel,@position)
    IF (@nextPosition = 0 OR @nextPosition IS NULL) SELECT @nextPosition = LEN(@iniTel) +1
    SELECT SUBSTRING(@iniTel, @position, @nextPosition - @position)
    SELECT @position = @nextPosition+1
END


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 * from sysprocesses a where  a.blocked=0 
   AND  EXISTS( select * from sysprocesses b where  b.blocked>0  and b.blocked = a.spid   )

*--处理死锁

查看当前进程,或死锁进程,并能自动杀掉死进程

因为是针对死的,所以如果有死锁进程,只能查看死锁进程
当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程

--*/
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
ALTER PROC [dbo].[p_lockinfo]
    @kill_lock_spid BIT = 1 , --是否杀掉死锁的进程,1 杀掉, 0 仅显示
    @show_spid_if_nolock BIT = 1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
AS 
    DECLARE @count INT ,
        @s VARCHAR(MAX) ,
        @i INT
    SELECT  id = IDENTITY( INT,1,1 ),
            标志 ,
            进程ID = spid ,
            线程ID = kpid ,
            块进程ID = blocked ,
            数据库ID = dbid ,
            数据库名 = DB_NAME(dbid) ,
            用户ID = uid ,
            用户名 = loginame ,
            累计CPU时间 = cpu ,
            登陆时间 = login_time ,
            打开事务数 = open_tran ,
            进程状态 = status ,
            工作站名 = hostname ,
            应用程序名 = program_name ,
            工作站进程ID = hostprocess ,
            域名 = nt_domain ,
            网卡地址 = net_address,
sql_handle,
stmt_start,
stmt_end

    INTO    #t
    FROM    ( SELECT    标志 = '死锁的进程' ,
                        spid ,
                        kpid ,
                        a.blocked ,
                        dbid ,
                        uid ,
                        loginame ,
                        cpu ,
                        login_time ,
                        open_tran ,
                        status ,
                        hostname ,
                        program_name ,
                        hostprocess ,
                        nt_domain ,
                        net_address ,
                        s1 = a.spid ,
                        s2 = 0,
sql_handle,
stmt_start,
stmt_end
              FROM      master..sysprocesses a
                        JOIN ( SELECT   blocked
                               FROM     master..sysprocesses
                               GROUP BY blocked
                             ) b ON a.spid = b.blocked
              WHERE     a.blocked = 0
              UNION ALL
              SELECT    '|_牺牲品_>' ,
                        spid ,
                        kpid ,
                        blocked ,
                        dbid ,
                        uid ,
                        loginame ,
                        cpu ,
                        login_time ,
                        open_tran ,
                        status ,
                        hostname ,
                        program_name ,
                        hostprocess ,
                        nt_domain ,
                        net_address ,
                        s1 = blocked ,
                        s2 = 1,
sql_handle,
stmt_start,
stmt_end
              FROM      master..sysprocesses a
              WHERE     blocked <> 0
            ) a
    ORDER BY s1 ,
            s2

    SELECT  @count = @@rowcount ,
            @i = 1

    IF @count = 0
        AND @show_spid_if_nolock = 1 
        BEGIN
            INSERT  #t
                    SELECT  标志 = '正常的进程' ,
                            spid ,
                            kpid ,
                            blocked ,
                            dbid ,
                            DB_NAME(dbid) ,
                            uid ,
                            loginame ,
                            cpu ,
                            login_time ,
                            open_tran ,
                            status ,
                            hostname ,
                            program_name ,
                            hostprocess ,
                            nt_domain ,
                            net_address,
sql_handle,
stmt_start,
stmt_end
                    FROM    master..sysprocesses
            SET @count = @@rowcount
        END

    IF @count > 0 
        BEGIN
            CREATE TABLE #t1
                (
                  id INT IDENTITY(1, 1) ,
                  a NVARCHAR(30) ,
                  b INT ,
                  EventInfo NVARCHAR(255)
                )
            IF @kill_lock_spid = 1 
                BEGIN
                    DECLARE @spid VARCHAR(10) ,
                        @标志 VARCHAR(10)
                    WHILE @i <= @count 
                        BEGIN
                            SELECT  @spid = 进程ID ,
                                    @标志 = 标志
                            FROM    #t
                            WHERE   id = @i
                            INSERT  #t1
                                    EXEC ( 'dbcc inputbuffer(' + @spid + ')'
                                        )
                            IF @标志 = '死锁的进程' 
                                EXEC('kill '+@spid)
                            SET @i = @i + 1
                        END
                END
            ELSE 
                WHILE @i <= @count 
                    BEGIN
                        SELECT  @s = 'dbcc inputbuffer('
                                + CAST(进程ID AS VARCHAR) + ')'
                        FROM    #t
                        WHERE   id = @i
                        INSERT  #t1
                                EXEC ( @s
                                    )
                        SET @i = @i + 1
                    END
            SELECT  标志 ,
数据库名 ,
 进程的SQL语句 = b.EventInfo,
sqlText=substring(qt.text,a.stmt_start/2, 
  (case when a.stmt_end = -1 
 then len(convert(nvarchar(max), qt.text)) * 2 
 else a.stmt_end end -a.stmt_start)/2
) ,
进程状态,
            用户名,
            累计CPU时间,
            登陆时间  ,
            工作站名 ,
            应用程序名,
进程ID ,
            线程ID  
            FROM    #t a
                    JOIN #t1 b ON a.id = b.id
OUTER apply sys.dm_exec_sql_text(a.sql_handle) as qt
        END
GO


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

timestamp:自动生成的唯一二进制数字数据类型,当一行数据改变时,会自动变化,它是唯一的值,每张表中只能有一个列类型为timestamp。timestamp 通常用作给表行加版本戳的机制。 存储大小为 8 个字节。 timestamp 数据类型只是递增的数字,不保留日期或时间。 若要记录日期或时间,请使用 datetime 数据类型。
datetime :是一个时间类型
timestamp使用方法:在一定时间存起时间戳,下次通过与记录时间戳与现在的时间戳进行比对,就知道哪些行进行过改动。


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, DECLARE @time DATETIME
SET @time = GETDATE()
 --------执行sql语句------
select datediff(ms,@time,getdate()) --打印结果

2,
SET STATISTICS TIME ON
    SELECT * FROM bdOrder b(NOLOCK)
    JOIN bmdCustomer c(NOLOCK) ON b.CustomerID = c.ID
    WHERE B.OrderDate >='2011-03-15'
SET STATISTICS TIME OFF
时间分为两个部分,一个是SQL语句的分析与编译时间,一个是实际执行时间elapsed time
CPU时间:指CPU调度时间,占用时间指执行时间
执行上述将返回:
SQL Server 分析和编译时间:
   CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

(2460 行受影响)

SQL Server 执行时间:
   CPU 时间 = 31 毫秒,占用时间 = 327 毫秒。


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, 全文索引:一般索引是按字段将字段整个数据进行排序,而全文索引是对字段数据中某一部分进行索引的建立。
与一般的索引立即更新不同,全文索引一般是定期维护索引的,所以对于频繁更新的数据不合适,需要做全文索引的对象一般都是论文网页之类。

2,使用:使用关键字:CONTAINS、FULLTEXT、CONTAINSTABLE、FREETEXTTABLE。
?? ??? ??? ??? ?例如:SELECT * FROM table_name WHERE CONTAINS(fullText_column,'”search contents*”‘)
?? ??? ??? ????
?? ?FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所?? ??? ??? ??? ??? ??? 以,FREETEXT语句所执行的功能又称做自由式全文查询。
??? 下面语句使用FREETEXT语句搜索Book表中包含“Successful Life”字符串的数据行:
?? ??? select title, notes from book where freetext(*,‘Successful Life’) ?

3, 建立步骤:
??? 1)确认安装了full text search service,并启动了 Microsoft ? Search ? 服务
2)数据库允许全文索引:EXEC sp_fulltext_database ‘enable’ go
或者右键数据库-文件-允许全文索引
??? 3)右击表,建立全文索引,在选择表/视图更改跟踪方式时:若是自动,则在表插入更新时会自动更新索引,手动即手动更新。
??? 4)数据库/存储下可看到全文目录

4,手动执行填充:execute sp_fulltext_catalog ‘FullText’,’start_incremental’ 增量填充
?? ??? ??? ??? ??? ??? ???? execute sp_fulltext_catalog ‘FullText’,’start_full’ 完全填充
??????????????????????????? 完全填充发生在第一次建立时,之后可以通过增量填充来完成,不过数据库表中段有timestamp字段,否则,即使执行了增量填充,实际执行的也是完全填充。

注:全文索引对数据分隔建立索引,故比一般索引以整个数据建立的方式速度要慢上一些,不过比全表扫描要快!
注:若出现timeout的情况,利用sql语句拼接的方式。因为有的数据库不支持动态sql参数
注:建立全文索引的表须有一唯一非空的列,以通过此列值将相关的词关连起来,在查找词时,通过全文检索找到列值,再通过列值返回行(聚集索引)


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中主键就是一种聚集索引,但聚集索引并不一定是主键,因为它限定的列数据中可以包含重复,而主键则不可以。
2,索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作,降低写入数据的速度。过多的索引甚至会导致索引碎片。

3,多个字段建立成一个索引时,若分开字段查询,那么用索引的起始列查询与用索引上的全部列查询速度是一样的,但若用索引的非起始列查询,那么索引不起作用。这使得:对于复合索引,起始列须是最经常使用的字段。


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“配置工具”中的“外围应用配置器”,选择“功能的外围应用配置器”。在弹出的对话框中选择数据库邮件,并选择“启用数据库邮件存储过程”。

2,进入SQL SERVER2005 Studio管理界面,就可以看到数据库邮件子项,
    在右键菜单中会有一个"配置数据库邮件"菜单,按照步骤先建立配置文件,然后创建账号,保存退出。在右键菜单的第二项"发送测试邮件",  在弹出的窗口中输入接收的邮件地址,发送就可以。

3,执行msdb.dbo.sp_send_dbmail存储过程发送邮件:
                  EXEC msdb.dbo.sp_send_dbmail
                  @profile_name = 'lvshou.com',
                  @recipients = 'zhengxuesong@lvshou.com',
                  @body_format = 'HTML',
                  @body = 'Test Body lalalala',
                  @subject = 'Test Subject lalalalala'; 
  发附件:
                EXEC msdb.dbo.sp_send_dbmail
                @recipients=N'chapman.tim@gmail.com',
                @body='Message Body', 
                @subject ='Message Subject',
                @profile_name ='Database-mailProfile',
                @file_attachments ='C:FileAttachment.txt'; //附件

注:若发送的对象是如126邮件,可以绑定手机的那种,则间接实现了用Sql Server催发短信的功能!

4,查看发送历史:
    use msdb
    go
    select * from sysmail_allitems
    select * from sysmail_mailitems
    select * from sysmail_event_log


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
 DECLARE @show_num  varchar(9);
 Declare @abc nvarchar(200)
set @abc = 'select count(*)  from visitcustomer';
exec ('declare mycur cursor for ' + @abc)

open mycur;
fetch next from mycur into @show_num;
close mycur; 
DEALLOCATE mycur
select @show_num;