MS_SQL_杂记(一)
最近一段时间项目转入SSIS,从DB2和TeraData向MSSql中迁入,其中又穿插了perl一些的知识,感觉这段时间相当的充实,以前一直关注C#,javascript,不怎么写sql,现在一天写一两千行的sql,脸不红,气不喘,一口气连上八楼都不心跳加速了.
因为一些知识只是临时性的添加,所以显得很杂乱.
(1)sql datatime 格式化
- Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
- Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
- Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
- Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
- Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
- Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
- Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
- Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
- Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
- Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
- Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
- Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
- Select CONVERT(varchar(100), GETDATE(), 12): 060516
- Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
- Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
- Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
- Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
- Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
- Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
- Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
- Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
- Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
- Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
- Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
- Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
- Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
- Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
- Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
- Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
- Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
- Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
- Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
- Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
- Select CONVERT(varchar(100), GETDATE(), 112): 20060516
- Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
- Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
- Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
- Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
- Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
- Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
- Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM
(2) openquery的使用
OpenQuery 是SQL Server用来与其他Server交互的一种技术,通过OpenQuery,SQL Server 可以直接访问其他数据库资源。而其他数据库在OpenQuery 表达式中是以Linked Server 存在的。 使用sp_linkedservers 可以找到当前数据库的所有linked server. OpenQuery的表达式可以这么写:
Select * from OpenQuery([linkedServerName],'Select * from T_test where id > 10')
但是如果要传递参数呢?那只能老办法,将整体做成一个字符串,然后在调用存储过程了
create proc Sp_GetDb2 ( @ExecuteTime datetime = getdate() ) as begin declare @ExecuteTime datetime = getdate() declare @sqlhead varchar(2012) = '' set @sqlhead = 'select * from openquery(db2_test,''select * from t_test where ctime > ' + Convert(varchar(10),@ExecuteTime,112)+ ''')' exec(@sqlhead) end
(3)跨数据库联合更新问题
1.跨数据库联合更新问题
Sql语句:
Update T_local set T_local.id = T2.id
From t_local T1,
(
Select * from openquery(TRD,’select * from t_test’)
) T2
Where T2.name = T1.name
Error:cannot resolve the collation conflict between "chinese_prc_ci_as" and "Chinese_Taiwan_Stroke_CI_AS_WS" in the equal to operation
附录:
在执行SQL语句时,可能会遇到:“无法解决 equal to 操作中的 **** 和 *******排序规则冲突”
一.错误分析:
这个错误是因为排序规则不一致造成的,我们做个测试,比如:
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,
value int)
create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,
value int
表建好后,执行连接查询:
select * from #t1 A inner join #t2 B on A.name=B.name
这样,错误就出现了:
服务器: 消息 446,级别 16,状态 9,行 1
无法解决 equal to 操作的排序规则冲突。
要排除这个错误,最简单方法是,表连接时指定它的排序规则,这样错误就
不再出现了。语句这样写:
select *
from #t1 A inner join #t2 B
on A.name=B.name collate Chinese_PRC_CI_AI_WS
二.排序规则简介:
什么叫排序规则呢?MS是这样描述的:"在 Microsoft SQL Server 2000 中,
字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存
储和比较字符所使用的规则。"
在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。
select * from ::fn_helpcollations()
排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:
Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则。
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS) 是否区分假名类型,KI不区分,KS区分
_WI(WS) 是否区分宽度 WI不区分,WS区分
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,
比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项
三、解决方法
1.将数据库中一个表的字段改成与另一个表中要比较的字段相同的排序规则。
2.在SQL语句的Where子句后面加上类似这样的SQL片段:collate Chinese_PRC_CI_AI_WS
如:
Select A.* From A,B Where A.a = B.b collate Chinese_PRC_CI_AI_WS
解决方法:
Update T_local set T_local.id = T2.id
From t_local T1,
(
Select * from openquery(TRD,’select * from t_test’)
) T2
Where T2.name = T1.name collate Chinese_PRC_CI_AS