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.一个月第一天的
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) ?

2.本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) ?

3.一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) ?

4.季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) ?

5.当天的半夜
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) ?

6.上个月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) ?

7.去年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) ?

8.本月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) ?

9.本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) ?

10.本月的第一个星期一
select DATEADD(wk, DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 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

declare @bonusnum? decimal(5, 3), 5代表总位数,3代表小数点后位数,故小数点右边的位数为5-3 = 2,最大到99,超出即是溢出错误


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 @v varchar(500)
set @v = ''
    SELECT  @v =  OperateCode 
        FROM
        (    
            SELECT 'd' operatecode
            union  all select 'e'
                
        ) T1
select @v
结果为 ‘e’ 即:这种赋值方式会遍历所有记录,将记录一一赋给@v,@v的值为最后一个。可利用这一特性,将一列转换到一格中存储
declare @v varchar(500)
set @v = ''
    SELECT  @v =  @v + OperateCode + ‘,’
        FROM
        (    
            SELECT 'd' operatecode
            union  all select 'e'
                
        ) T1
select @v
结果为:d,e


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,OrderBy 列名
2, OrderBy 第几列??? 如:OrderBy 2???? 按第二列排序?????? OrderBy newid() 随机排序
3, 逆序排: OrderBy 列名 desc? 或Order By -列名


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 Server,具体的操作,要在每个数据库中建立用户,并指定这个用户与登录名关联,这样在通过某个登录名进入之后,就可直接用关联的用户进行数据库的读写操作。

应用:当建立过关联的登录名删除之后,再重新建立此登录名并指定与数据库关联的用户时会出现:
用户、组或角色’test’在当前数据库中已存在(Microsoft SQL Server,错误:15023)
这是因为指定的关联的用户名已经存在,解决方法:
1,指定一个新的关联用户名即可。
2,删除掉原来关联的用户名,再关联
3,修复与登录名与原来的用户名的关联:
sp_change_users_login ‘Report’? –查看
sp_change_users_login ‘update_one’, ‘用户名’, ‘登录名’


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水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。
  水平分割通常在下面的情况下使用。
  ?表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
   ?表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
  ?需要把数据存放到多个介质上。
? 水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。  
  2垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。
  如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数。其缺点是需要管理冗余列,查询所有数据需要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

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

select * from gc_dfys

union

select * from ls_jg_dfys

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。

而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:

select * from gc_dfys

union all

select * from ls_jg_dfys


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
主要是一行的数据某些字段整成一个table,对此table进行操作即可
基础:select *, (select orderno) as new from bdorder , 可多次用select操作字段
扩展:可多次用select 取出数据,union成一个table 处理
举例:取出一行中最大的值
  
IF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
GO
CREATE TABLE [tb](
a SMALLINT,
b SMALLINT,
c SMALLINT,
d SMALLINT,
e SMALLINT,
f SMALLINT,
g SMALLINT 
)
INSERT [tb]
SELECT 1,2,3,4,5,2,3 UNION ALL
SELECT 4,5,6,7,7,2,0 UNION ALL
SELECT 4,9,6,7,7,9,6
GO
--SELECT * FROM [tb]
 
-->SQL查询如下:
 
SELECT *,
    (SELECT MAX(a)
     FROM(
       SELECT a UNION ALL       --用select 取出值union成table
       SELECT b UNION ALL
       SELECT c UNION ALL
       SELECT d UNION ALL
       SELECT e UNION ALL
       SELECT f UNION ALL
       SELECT g
       ) AS t   
    ) AS maxvalue
FROM tb


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,若或一字段值设置为n个空串即: ‘????????????????? ‘? 但在存储时依然会存为”,长度为0, 即数据库会自动完成trim操作, 故可用filed <> ” 来避免为空的字段
2,若字段值设置为’a???? ‘ ,则存储时为’a’, 长度为1
3,若字段值设置为’? a???? ‘ ,则存储时为’? a’, 长度为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

declare @temp1 varchar(20)
select @temp1=orderdate from bdorder
where orderno = ‘J090825A001′

print @temp1

select * from bdorder
where orderdate = @temp1

执行上述语句,结果为空!即使@temp1有值
原因:时间类型的优先级高于字符型,所以当比较一个DATETIME类型的数据和一个字符串的时候,字符串首先会转化成DATETIME。
select @temp1=orderdate ,因datetime优先级比@temp1优先级高,为varchar类型@temp1赋值的时候要向下转型,
默认调用convert(varchar(20),orderdate,100) 转换成mon dd yyyy hh:miAM(或 PM)格式。
而当进行比较时where orderdate = @temp1,@temp1因向上转型,保持数据不平(参考int向上转为float),此时@temp1为’04? 6 2010? 8:36AM’,而数据库中的日期为’2010-04-06 08:36:38′, 二者相比当然是得不到结果的。

注:sql server中DateTime默认存储方式为:yyyy-mm-dd hh:mi:ss(24h),当为varchar赋值时,默认转换成了mon dd yyyy hh:miAM(或 PM)格式,二者再进行比较,就会出问题。即:默认存储方式与默认转换方式不同造成的。

解决方案:为varchar赋值时取消默认,即:
select @temp1=convert(varchar(20),orderdate,120) from bdorder where orderno = ‘J090825A001’


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

RAISERROR(‘该客户已经分配给了(%s)’, 16, 1, @description), 在程序中通过try..catch捕捉,消息就是e.Message,前提是指定严重级别为11-19,如此时的16

RAISERROR ( { msg_id | msg_str | @local_variable }
????{ ,severity ,state }
????[ ,argument [ ,...n ] ] )
????[ WITH option [ ,...n ] ]

?

msg_id
使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消息号。用户定义错误消息的错误号应当大于 50000。

msg_str
用户定义消息,格式与 C 标准库中的 printf 函数类似。当指定 msg_str 时,RAISERROR 将引发一个错误号为 5000 的错误消息。因为此时用的是str,不是msg_id,sys.messages中没有存此错误信息,但这个函数功能就是抛出错误,只能由系统来提供。

severity
用户定义的与该消息关联的严重级别。当使用 msg_id 引发使用 sp_addmessage 创建的用户定义消息时,RAISERROR 上指定的严重性将覆盖 sp_addmessage 中指定的严重性。

在严重级别为 11 到 19 的情况下在 TRY 块中运行的 RAISERROR 会将控制传输至关联的 CATCH 块。指定严重级别为 10 或更低以使用 RAISERROR 返回 TRY 块中的消息,而不必调用 CATCH 块。

state
介于 1 至 127 之间的任意整数。state 的负值默认为 1。值为 0 或大于 127 会生成错误。

如果在多个位置引发相同的用户定义错误,则针对每个位置使用唯一的状态号有助于找到引发错误的代码段


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

直接在目标数据库上还原会出现:“备分集中的数据库备分与现有的数据库不同”的错误,
解决方法:解决办法:选项 -->还原选项 -->覆盖现有数据库 --> 确定


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

row_number() 的使用

WITH OrdersByOrderIDASC AS
(
SELECT
top 10 id,orderno, row_number() over(order by orderdate desc) as rowid
FROM bdorder
)

select * from OrdersByOrderIDASC
where rowid >=3 and rowid <=10 with as 用法:把重复用到的SQL语句放在with as 里面,取一个别名,后面的查询就可以用它 这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了 上面等同于: select * from ( SELECT top 10 id,orderno, row_number() over(order by orderdate desc) as rowid FROM bdorder )a where rowid >=3 and rowid <=10 注:(1) with 必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。 (2) 可以引用自身(递归),也可以引用在同一 WITH 子句中预先定义的 CTE。不允许前向引用。 (3) . 不能在 CTE_query_definition 中使用以下子句: COMPUTE 或 COMPUTE BY ORDER BY(除非指定了 TOP 子句) INTO 带有查询提示的 OPTION 子句 FOR XML FOR BROWSE


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

保留sysindexes是为了向后兼容sql server2000之前的版本,以后可能就不再使用,而是以sys.为主
故查询一个表有多少行时可用:

SELECT *
FROM sys.partitions where object_id = object_id(‘bdorder’) and index_id = 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 b.name,a.rowcnt from sysindexes a,sysobjects b
where a.id=b.id and a.indid<=2 and b.xtype='u' rowcnt bigint 基于 indid = 0 和 indid = 1 的数据级行计数。 故用a.indid <= 2 单个表记录数,占用空间数:sp_spaceused 'bdorder' 数据库所有表各个记录数,占用空间数: EXEC sp_MSforeachtable @command1="sp_spaceused '?'"


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 name 
from sysobjects a
where exists(
        select 1 from syscolumns b
        where name = 'customerid'
        and b.id =a.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

取出大量数据进行操作时,游标慢一些,可用临时表与表变量
临时表:
CREATE TABLE dbo.#News
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )
  INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
  VALUES (1,’BlueGreen’, ‘Austen’, 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News

  DROP TABLE dbo.[#News]? –操作完之后删掉

表变量:DECLARE @News table
  (
  News_id int NOT NULL,
  NewsTitle varchar(100),
  NewsContent varchar(2000),
  NewsDateTime datetime
  )
  INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)
  VALUES (1,’BlueGreen’, ‘Austen’, 200801, GETDATE())
  SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News

临时表分为本地和全局两种,本地临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都是以“##”为前缀
 表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量
临时表存放在磁盘上,而表变量存于内存中,就是一变量。


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.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG

2.截断事务日志:
BACKUP LOG 数据库名 WITH NO_LOG

3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器–右键你要压缩的数据库–所有任务–收缩数据库–收缩文件
–选择日志文件–在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
–选择数据文件–在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小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
1,同一服务器上  select * from brm_lvjian.dbo.bdorder  或 select * from brm_lvjian..bdorder
2,不同服务器上数据库的访问
(1)长久式:在本地服务器上创建远程连接
exec sp_addlinkedserver   'dpserver', ' ', 'SQLOLEDB ', '192.168.18.140'
exec sp_addlinkedsrvlogin 'dpserver ', 'false ',null, 'sa', 'sa'
select *  from dpserver.brm_lvjian_new.dbo.bdcustomerprotect    -- 执行:
exec sp_dropserver 'dpserver', 'droplogins'  --删除连接
注:1,或者在数据库 -- 服务器对象 -- 链接服务器上操作
查看链接服务器
sp_helplinkedsrvlogin
详细信息:select * from sys.servers
2,不可select * into 链接服务器...,而要用 insert into 链接服务器..       select ...
 注:在开Rpc的时候提示:不允许对系统目录进行即席更新! 可利用sql语句解决,方法:
 执行:
 EXEC master.dbo.sp_serveroption @server=N'serverstatistics', @optname=N'rpc', @optvalue=N'true'
 GO
 EXEC master.dbo.sp_serveroption @server=N'serverstatistics', @optname=N'rpc out', @optvalue=N'true'
 GO 
 (上述代码可通过右键链接服务器,编写链接服务器脚本为 - CREATE-新查询编辑器窗口得到。)
3,设置超时时间,防止链接服务器挂掉时,无限卡
dbo.sp_serveroption @server=N'serverstatistics', @optname=N'connect timeout', @optvalue=15
connect timeout:连接到链接服务器时的超时值(秒),如果为 0,则使用 sp_configure 的默认remote query timeout 选项值。
query timeout:查询超时值 链接服务器上执行的查询的超时值(秒)。如果为 0,则使用 sp_configure 的默认 query wait 选项值。

4,测试链接服务器是否链接成功。declare @srvr nvarchar(128);
declare @retval int;

SET @srvr = 'oaserver'
EXEC @retval = sys.sp_testlinkedserver @srvr
SELECT @retval

0(成功)或 1(失败)








(2)短暂式:
1)openrowset
    select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
     insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    select *from 本地表 

2)opendatasource
SELECT   * FROM   opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 

3)openquery
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')

3,链接服务器与事务
在事务中,访问链接服务器,要注意:
1)本地链接服务器内容不能在本地服务器事务中访问,因为链接服务器与发起事务服务器是同一台,故直接引用数据库名称即可。不需要转来转去。
2)在发起事务的服务器上访问链接服务器,在存储过程中执行语句前,要set xact_abort on,不然一般会报错如:
无法启动链接服务器 "bim" 的 OLE DB 访问接口 "SQLNCLI" 的嵌套事务。由于 XACT_ABORT 选项已设置为 OFF,因此必须使用嵌套事务。

4,执行链接服务器上的函数
DECLARE @Customerid int
SET @Customerid =  (SELECT  * from OPENQUERY(BRMSERVER,'select .dbo.[GetCustomerIdByTel](0,18620023427,0)'))
SELECT @Customerid


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

内存要比磁盘读取速度快很多。
数据在sqlserver上执行,就是在磁盘上读取,比相应的在内存中读取速度当然慢许多,不过要在内存中执行,不得不要将数据集存到内存中,造成了I/O开销,二者加起来,内存读取速度也将慢下来。内存与磁盘如何平衡?一个是高读取速度,但I/O开销大,一个是低读取速度,但I/O开销小。
故当:可取到的数据集较小时,可放到内存中,利用内存的高读取速度进行执行,以提高整体运行速度。

当在数据库上运行速度慢时,可考虑将数据集存放到内存中读取,试下速度。取速度最小的。
典型情况:对某一大表(30个字段)的某一列按多个条件进行count统计,在sql server运行时,开销很大,可考虑将这一列取出放到内存中再进行据条件的count操作。
注:big表有30个字段,1741笔资料,smail有1个字段,也是1741笔资料
select count(1) from big? select count(1) from smaill?
即使两者行数相同,执行速度也会差很多,因为big表要扫描整个表,而这个表有30个字段,每个字段都要扫描,