转自: 

前日查资料查到7年前本身写的blog,被英特网转发了几十三遍,却没三个把自家的原来的文章链接标志出来,漠视一下。

转自:http://www.maomao365.com/?p=7205

mssql update from 语法

显然,平日在mysql过滤相通记录时常用的重大字是distinct, group
by等入眼字,然而怎么过滤七个例外的字段相符的笔录呢。

摘要:

下文呈报sql脚本中过滤百分号的点子:


实验情形:sql server 2010 揽胜极光2 

找了半天才找到原贴:http://huxiao.iteye.com/blog/629030

摘要:

复制代码 代码如下:

以下是主题素材供给:


宛如我们一贯用的*和?,sql的like语句中,使用%和_来表示私自四个字符和贰个字符

下文分享两条sql求杭剧本,再一次求和的法子分享

update a set a.columnname=b.columnname from a,b where b.id=1

有一张表chat_history中留存字段id,from_uid,to_uid等字段,其中id为自增id,from_uid为音信的发送方的uid,to_uid为选用方的uid,以后急需得到某一个uid的新星际联盟系人。

百分号:在sql脚本编写中“百分号”被界定为豆蔻年华种通配符,那么黄金年代旦大家需寻觅数据中是还是不是存在百分号时,需利用何种措施吧?
下文通超过实际例的措施深入分析百分号的相称情势。
 

# %代表任意多个字符  
select * from user where username like '%huxiao';    
select * from user where username like 'huxiao%';    
select * from user where username like '%huxiao%';  

# %代表一个字符  
select * from user where username like '_';    
select * from user where username like '______';    
select * from user where username like 'huxia_';    
select * from user where username like 'h_xiao';  
 /*
     例:
       下文已知两条sql求和脚本,现需对两张不同表的求和记录再次求和   
     */  
     ---对两条求和sql脚本求和的方法
      select sum(q) from 
      (
       select sum(qty)  as q from tableNameA where ...
       union all 
        select sum(qty)  as q from tableNameB where ...
       ) as table

     ---对多条求和sql脚本,再次求和的方法分享
     select sum(q) from 
      (
       select sum(qty)  as q from tableNameA where ...
       union all 
        select sum(qty)  as q from tableNameB where ...
         union all 
        select sum(qty)  as q from tableNameC where ...
        union all 
        select sum(qty)  as q from tableNameD where ...
       ...  
    ) as table

1.系统表sysobjects

率先的率先个主见正是对from_uid,to_uid举办group
by操作然后获得max(id)过滤出from_uid或者to_uid等于目的uid的值。

1        ---在sql server中,如果需要检索百分号是否存在数据中,我们使用以下方法:
2       ---方法1:中括号括起百分号进行过滤操作
3            select * from tableName where [列名]  like '%[%]%'  ---采用中括号括起百分号
4       ---方法2.1:  采用escape指定匹配条件中转义字符为~,对百分号进行转义查询
5        select *,'1.2' as [例2] from tableName where [列名]  like '%~%%'   escape '~' 
6         ---2.2采用escape指定匹配条件中转义字符为t,对百分号进行转义查询
7        select *,'1.3' as [例3] from tableName where [列名]  like '%t%%'   escape 't'
8  

假设笔者就实在要查%或然,如何是好吧?使用escape,转义字符前边的%或就不作为通配符了,注意日前未有转义字符的%和_反之亦然起通配符效率

 

在数据库中开创的每种对象(举例限制、私下认可值、日志、法规以致存款和储蓄进程)都对应黄金年代行。

根据这种主见大家能够收获如下的sql语句

 

select username from gg_user where username like '%xiao/_%' escape '/';  
select username from gg_user where username like '%xiao/%%' escape '/';  
列名 数据类型 说明

name

sysname

对象名

id

int

对象标识号

xtype

char(2)

对象类型。可以是以下对象类型之一:

AF = 聚合函数 (CLR)

C = CHECK 约束

D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束

L = 日志

FN = 标量函数

FS = 程序集 (CLR) 标量函数

FT = 程序集 (CLR) 表值函数

IF = 内联表函数

IT = 内部表

P = 存储过程

PC = 程序集 (CLR) 存储过程

PK = PRIMARY KEY 约束(类型为 K)

RF = 复制筛选存储过程

S = 系统表

SN = 同义词

SQ = 服务队列

TA = 程序集 (CLR) DML 触发器

TF = 表函数

TR = SQL DML 触发器

TT = 表类型

U = 用户表

UQ = UNIQUE 约束(类型为 K)

V = 视图

X = 扩展存储过程

uid

smallint

对象所有者的架构 ID。

对于从旧版 SQL Server 升级的数据库,架构 ID 等于所有者的用户 ID。

重要提示:
如果使用以下任何一个 SQL Server DDL 语句,则必须使用 sys.objects 目录视图而不是 sys.sysobjects。 CREATE | ALTER | DROP USER CREATE | ALTER | DROP ROLE CREATE | ALTER | DROP APPLICATION ROLE CREATE SCHEMA ALTER AUTHORIZATION ON OBJECT

 

如果用户数和角色数超过 32,767,则发生溢出或返回 NULL。

有关详细信息,请参阅查询 SQL Server 系统目录

info

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

status

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

base_schema_ver

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

replinfo

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

parent_obj

int

父对象的对象标识号。例如,表 ID(如果父对象是触发器或约束)。

crdate

datetime

对象的创建日期。

ftcatid

smallint

注册为使用全文索引的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。

schema_ver

int

在每次更改表的架构时都会增加的版本号。始终返回 0。

stats_schema_ver

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

type

char(2)

对象类型。可以是下列值之一:

AF = 聚合函数 (CLR)

C = CHECK 约束

D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束

FN = 标量函数

FS = 程序集 (CLR) 标量函数

FT = 程序集 (CLR) 表值函数 IF = 内联表函数

IT – 内部表

K = PRIMARY KEY 或 UNIQUE 约束

L = 日志

P = 存储过程

PC = 程序集 (CLR) 存储过程

R = 规则

RF = 复制筛选存储过程

S = 系统表

SN = 同义词

SQ = 服务队列

TA = 程序集 (CLR) DML 触发器

TF = 表函数

TR = SQL DML 触发器

TT = 表类型

U = 用户表

V = 视图

X = 扩展存储过程

userstat

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

sysstat

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

indexdel

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

refdate

datetime

标识为仅供参考。不提供支持。不保证以后的兼容性。

version

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

deltrig

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

instrig

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

updtrig

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

seltrig

int

标识为仅供参考。不提供支持。不保证以后的兼容性。

category

int

用于发布、约束和标识。

cache

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

select max(id) as mid,from_uid,to_uid from chat_history where from_uid="xxxxxx" or to_uid = "xxxxxx" group by from_uid, to_uid order by mid. 

参考 sys.sysobjects
(Transact-SQL)

那儿我们查阅结果能够很引人瞩目标发掘三个标题,假使八个彼此通讯的uid1和uid2,我们经过下边包车型地铁sql语句获取到两条数据from_uid=uid1,to_uid=uid2和from_uid=uid2,to_uid=uid1。当然那也小意思,数据咱们曾经查到了,大家能够透进程序再对结果开展贰回联合,大家即可获得大家盼望获得的数量。

 

在几天前关系超少的气象下,上述的拍卖情势并未怎么不伏贴的地点,可是当这段日子挂钩人比较多时,大家恐怕会想到利用分页对列表页实行分页。不过上述的做法很引人瞩目就曾经达不到我们的预想了,大家意在将其构成到一条sql语句中,而且能够利用limit关键字。

2.syscolumns

通过阅览,大家期望过滤诸如from_uid=uid1,to_uid=uid2和from_uid=uid2,to_uid=uid1那样的笔录,第风流洒脱影响就是我们得以在上述的sql语句作为有的时候表,再在外层加sql语句举行拍卖,当然这种方法从逻辑上是成家立计的,不过她是以投身功能来落实的,博主个人是比较厌烦使用中间表的。

为各样表和视图中的每列重临大器晚成行,并为数据库中的存款和储蓄进程的种种参数再次来到生机勃勃行。

经过对上述结果的洞察,大家得以拿走这样生龙活虎种消息,uid1,uid2是还是不是能够作为贰个字段进行管理吧,在mysql中留存重大子concat那是对八个字段实行统风流倜傥操作,但是轻巧的concat(from_uid,to_uid)还是达不到我们希望的结果,不过mysql提供了逻辑运算,case
操作。

列名 数据类型 说明

name

sysname

列名或过程参数的名称。

id

int

此列所属表的对象 ID,或者与此参数关联的存储过程的 ID。

xtype

tinyint

sys.types 中的物理存储类型。

typestat

tinyint

标识为仅供参考。不提供支持。不保证以后的兼容性。

xusertype

smallint

扩展的用户定义数据类型的 ID。如果数据类型的数字超过 32,767,则溢出或返回 NULL。有关详细信息,请参阅查询 SQL Server 系统目录

length

smallint

sys.types 中的最大物理存储长度。

xprec

tinyint

标识为仅供参考。不提供支持。不保证以后的兼容性。

xscale

tinyint

标识为仅供参考。不提供支持。不保证以后的兼容性。

colid

smallint

列 ID 或参数 ID。

xoffset

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

bitpos

tinyint

标识为仅供参考。不提供支持。不保证以后的兼容性。

reserved

tinyint

标识为仅供参考。不提供支持。不保证以后的兼容性。

colstat

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

cdefault

int

此列的默认值的 ID。

domain

int

此列的规则或 CHECK 约束的 ID。

number

smallint

过程分组时的子过程号。

0 = 非过程项

colorder

smallint

标识为仅供参考。不提供支持。不保证以后的兼容性。

autoval

varbinary(8000)

标识为仅供参考。不提供支持。不保证以后的兼容性。

offset

smallint

此列所在行的偏移量。

collationid

int

列的排序规则的 ID。对于非字符列,此值为 NULL。

status

tinyint

用于说明列或参数的属性的位图:

0x08 = 列允许空值。

0x10 = 添加 varcharvarbinary 列时,执行 ANSI 填充。保留 varchar 列的尾随空格以及 varbinary 列的尾随零。

0x40 = 参数为 OUTPUT 参数。

0x80 = 列为标识列。

type

tinyint

sys.types 中的物理存储类型。

usertype

smallint

sys.types 中的用户定义数据类型的 ID。如果数据类型数超过 32767,则会发生溢出或返回 NULL。有关详细信息,请参阅查询 SQL Server 系统目录

printfmt

varchar(255)

标识为仅供参考。不提供支持。不保证以后的兼容性。

prec

smallint

此列的精度级别。

-1 = xml 或大值类型。

scale

int

此列的小数位数。

NULL = 数据类型不是数值。

iscomputed

int

指示列是否为计算列的标志:

0 = 非计算列。

1 = 计算列。

isoutparam

int

指示过程参数是否为输出参数:

1 = True

0 = False

isnullable

int

指示列是否允许空值:

1 = True

0 = False

collation

sysname

列的排序规则的名称。如果不是基于字符的列,则为 NULL。

可以将以上sql语句改良如下:

参考 sys.syscolumns
(Transact-SQL)

SELECT max( id ) AS mid, from_uid, to_uid, 
        CASE to_uid
        WHEN 'xxx'
 THEN concat( to_uid, from_uid )
 ELSE concat( from_uid, to_uid )
 END AS to_from_uid
FROM chat_history
WHERE to_uid = 'xxx' OR from_uid = 'xxx'
GROUP BY to_from_uid
ORDER BY mid DESC
LIMIT 0,20

 

,
group by等根本字,可是怎么过滤八个例外的字段雷同的记录呢。
以下是难题需…

删去某数据库内的表

declare dlist cursor for
 select   name   from   sysobjects   where xtype=’U’
 open dlist
declare @n varchar(4000)
fetch next from dlist into @n
while @@fetch_status=0
 begin
        declare @es varchar(4000)
        set @es=’DROP table 
‘+@n
         exec( @es)  
  fetch next from dlist into @n
 end
close dlist
DEALLOCATE dlist

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图