您的位置:新葡亰496net > 网络数据库 > 常用语法,sql语句语法

常用语法,sql语句语法

发布时间:2019-06-15 23:48编辑:网络数据库浏览(65)

    阅读目录

    一、SQL分类

    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)

    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

     

    一、SQL分类

    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)

    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

     

    一、基础

    基础SQL语句/语法,sql语句语法

    SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很不错,就分享给大家!
    简要介绍基础语句: 
    1、说明:创建数据库 

    Create DATABASE database-name 
    2、说明:删除数据库 

    drop database dbname 
    3、说明:备份sql server

    --- 创建 备份数据的 device 
    USE master 
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' 
    --- 开始 备份 
    BACKUP DATABASE pubs TO testBack 
    4、说明:创建新表 

    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 
    根据已有的表创建新表: 
    A:create table tab_new like tab_old (使用旧表创建新表) 
    B:create table tab_new as select col1,col2… from tab_old definition only 
    5、说明:删除新表

    drop table tabname 
    6、说明:增加一个列 
    Alter table tabname add column col type 
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型 
    的长度。 
    7、说明:添加主键: Alter table tabname add primary key(col) 

    说明:删除主键: Alter table tabname drop primary key(col) 
    8、说明:创建索引:create [unique] index idxname on tabname(col….) 
    删除索引:drop index idxname 
    注:索引是不可更改的,想更改必须删除重新建。 
    9、说明:创建视图:create view viewname as select statement 

    删除视图:drop view viewname 
    10、说明:几个简单的基本的sql语句 

    选择:select * from table1 where 范围 
    插入:insert into table1(field1,field2) values(value1,value2) 
    删除:delete from table1 where 范围 
    更新:update table1 set field1=value1 where 范围 
    查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! 
    排序:select * from table1 order by field1,field2 [desc] 
    总数:select count as totalcount from table1 
    求和:select sum(field1) as sumvalue from table1 
    平均:select avg(field1) as avgvalue from table1 
    最大:select max(field1) as maxvalue from table1 
    最小:select min(field1) as minvalue from table1 
    11、说明:几个高级查询运算词 

    A: UNION 运算符 
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生 
    出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派 
    生表的每一行不是来自 TABLE1 就是来自 TABLE2。 
    B: EXCEPT 运算符 
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个 
    结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
    C: INTERSECT 运算符 
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果 
    表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
    注:使用运算词的几个查询结果行必须是一致的。 
    12、说明:使用外连接 

    A、left outer join: 
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 
    sql: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 
    B:right outer join: 
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 
    C:full outer join: 
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 
    13、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 

    法一:select * into b from a where 1<>1 
    法二:select top 0 * into b from a 
    14、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) 

    insert into b(a, b, c) select d,e,f from b; 
    15、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) 

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库' where 条件 
    例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where.. 
    16、说明:子查询(表名1:a 表名2:b)

    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)  

    SQL是现在进入互联网工作人们的必须技能之一,下面分享自己觉得很nice的SQL基本语句,从网上找了,觉得很...

    • 一、SQL分类
    • 二、基础语句
    • 三、sql技巧
    • 四、(MS SQL Server)SQL语句导入导出大全

    二、基础语句

    二、基础语句

      1、说明:创建数据库

    回到目录

    2.1、说明:创建数据库

    create database db-name
    

    2.1、说明:创建数据库

    create database db-name
    
    CREATE DATABASE database-name
    

    一、SQL分类

    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)

    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)

    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

     

    回到目录

    2.2、说明:删除数据库

    drop database db-name 
    

    2.2、说明:删除数据库

    drop database db-name 
    

      2、说明:删除数据库

    二、基础语句

    2.3、说明:备份sql server

    --- 创建 备份
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    

    2.3、说明:备份sql server

    --- 创建 备份
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    
    drop database dbname
    

    2.1、说明:创建数据库

    create database db-name
    

    2.4、说明:创建新表

    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    

    2.4、说明:创建新表

    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    

      3、说明:备份sql server

    2.2、说明:删除数据库

    drop database db-name 
    

    2.5、说明:删除新表

    drop table tabname
    

    2.5、说明:删除新表

    drop table tabname
    
    1 --- 创建 备份数据的 device
    2 
    3   USE master
    4 
    5   EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
    6 
    7   --- 开始 备份
    8 
    9   BACKUP DATABASE pubs TO testBack
    

    2.3、说明:备份sql server

    --- 创建 备份
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    

    2.6、说明:增加一个列

    Alter table tabname add column col type
    

    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    2.7、说明:添加/删除主键

    Alter table tabname add primary key(col)
    Alter table tabname drop primary key(col)
    

    2.8、说明:创建/删除索引

    create [unique] index idxname on tabname(col….)
    drop index idxname
    

    注:索引是不可更改的,想更改必须删除重新建。

    2.9、说明:创建/删除视图

    create view viewname as select statement
    drop view viewname
    

    2.6、说明:增加一个列

    Alter table tabname add column col type
    

    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    2.7、说明:添加/删除主键

    Alter table tabname add primary key(col)
    Alter table tabname drop primary key(col)
    

    2.8、说明:创建/删除索引

    create [unique] index idxname on tabname(col….)
    drop index idxname
    

    注:索引是不可更改的,想更改必须删除重新建。

    2.9、说明:创建/删除视图

    create view viewname as select statement
    drop view viewname
    

      4、说明:创建新表

    2.4、说明:创建新表

    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    

    2.10、说明:基本sql语句选择

    查询:select * from table1 where 范围
    插入:insert into table1(field1,field2) s(1,2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=1 where 范围
    查找:select * from table1 where field1 like ’%1%’ ---like的语法
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sum from table1
    平均:select avg(field1) as avg from table1
    最大:select max(field1) as max from table1
    最小:select min(field1) as min from table1
    

    2.10、说明:基本sql语句选择

    查询:select * from table1 where 范围
    插入:insert into table1(field1,field2) s(1,2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=1 where 范围
    查找:select * from table1 where field1 like ’%1%’ ---like的语法
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sum from table1
    平均:select avg(field1) as avg from table1
    最大:select max(field1) as max from table1
    最小:select min(field1) as min from table1
    
    1 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    2 
    3   --根据已有的表创建新表:
    4 
    5   A:create table tab_new like tab_old (使用旧表创建新表)
    6 
    7   B:create table tab_new as select col1,col2… from tab_old definition only
    

    2.5、说明:删除新表

    drop table tabname
    

    2.11、说明:高级查询运算

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。

    当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

    两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。

    当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。

    当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

    注:使用运算词的几个查询结果行必须是一致的。

    2.11、说明:高级查询运算

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。

    当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

    两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。

    当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。

    当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

    注:使用运算词的几个查询结果行必须是一致的。

      5、说明:删除新表

    2.6、说明:增加一个列

    Alter table tabname add column col type
    

    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    2.7、说明:添加/删除主键

    Alter table tabname add primary key(col)
    Alter table tabname drop primary key(col)
    

    2.8、说明:创建/删除索引

    create [unique] index idxname on tabname(col….)
    drop index idxname
    

    注:索引是不可更改的,想更改必须删除重新建。

    2.9、说明:创建/删除视图

    create view viewname as select statement
    drop view viewname
    

    2.12、说明:使用外连接

    A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

     

    2.12、说明:使用外连接

    A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

     

    1 drop table tabname
    

    2.10、说明:基本sql语句选择

    新葡亰496net 1

    查询:select * from table1 where 范围
    插入:insert into table1(field1,field2) s(1,2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=1 where 范围
    查找:select * from table1 where field1 like ’%1%’ ---like的语法
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sum from table1
    平均:select avg(field1) as avg from table1
    最大:select max(field1) as max from table1
    最小:select min(field1) as min from table1
    

    新葡亰496net 2

    补充:

    1)、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

    法一:select * into b from a where 1<>1
    
    法二:select top 0 * into b from a
    

    2)、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

    insert into b(a, b, c) select d,e,f from b; 
    

    3)、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    
    例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..
    

    4)、说明:子查询(表名1:a 表名2:b)

    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 
    

    5)、说明:显示文章、提交人和最后回复时间

    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    

    6)、说明:外连接查询(表名1:a 表名2:b)

    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 
    

    7)、说明:在线视图查询(表名1:a )

    select * from (SELECT a,b,c FROM a) T where t.a > 1; 
    

    8)、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2
    

    9)、说明:in 的使用方法

    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 
    

    10)、说明:两张关联表,删除主表中已经在副表中没有的信息

    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    

    11)、说明:四表联查问题

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 
    

    12)、说明:日程安排提前五分钟提醒

    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 
    

    13)、说明:一条sql 语句搞定数据库分页

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    

    14)、说明:前10条记录

    select top 10 * form table1 where 范围 
    

    15)、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 
    

    16)、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

    (select a from tableA ) except (select a from tableB) except (select a from tableC) 
    

    17)、说明:随机取出10条数据

    select top 10 * from tablename order by newid() 
    

    18)、说明:随机选择记录

    select newid()
    

    19)、说明:删除重复记录

    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 
    

    20)、说明:列出数据库里所有的表名

    select name from sysobjects where type='U'
    

    21)、说明:列出表里的所有的

    select name from syscolumns where id=object_id('TableName') 
    

    22)、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

    select type,
    sum(case vender when 'A' then pcs else 0 end),
    sum(case vender when 'C' then pcs else 0 end),
    sum(case vender when 'B' then pcs else 0 end)
    FROM tablename group by type
    

    显示结果:

    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3
    

    23)、说明:初始化表table1

    TRUNCATE TABLE table1 
    

    24)、说明:选择从10到15的记录

    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
    

     

    补充:

    1)、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

    法一:select * into b from a where 1<>1
    
    法二:select top 0 * into b from a
    

    2)、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

    insert into b(a, b, c) select d,e,f from b; 
    

    3)、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    
    例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..
    

    4)、说明:子查询(表名1:a 表名2:b)

    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 
    

    5)、说明:显示文章、提交人和最后回复时间

    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    

    6)、说明:外连接查询(表名1:a 表名2:b)

    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 
    

    7)、说明:在线视图查询(表名1:a )

    select * from (SELECT a,b,c FROM a) T where t.a > 1; 
    

    8)、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2
    

    9)、说明:in 的使用方法

    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 
    

    10)、说明:两张关联表,删除主表中已经在副表中没有的信息

    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    

    11)、说明:四表联查问题

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 
    

    12)、说明:日程安排提前五分钟提醒

    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 
    

    13)、说明:一条sql 语句搞定数据库分页

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    

    14)、说明:前10条记录

    select top 10 * form table1 where 范围 
    

    15)、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 
    

    16)、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

    (select a from tableA ) except (select a from tableB) except (select a from tableC) 
    

    17)、说明:随机取出10条数据

    select top 10 * from tablename order by newid() 
    

    18)、说明:随机选择记录

    select newid()
    

    19)、说明:删除重复记录

    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 
    

    20)、说明:列出数据库里所有的表名

    select name from sysobjects where type='U'
    

    21)、说明:列出表里的所有的

    select name from syscolumns where id=object_id('TableName') 
    

    22)、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

    select type,
    sum(case vender when 'A' then pcs else 0 end),
    sum(case vender when 'C' then pcs else 0 end),
    sum(case vender when 'B' then pcs else 0 end)
    FROM tablename group by type
    

    显示结果:

    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3
    

    23)、说明:初始化表table1

    TRUNCATE TABLE table1 
    

    24)、说明:选择从10到15的记录

    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
    

     

      6、说明:增加一个列

    2.11、说明:高级查询运算

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。

    当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

    两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。

    当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。

    当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

    注:使用运算词的几个查询结果行必须是一致的。

    三、sql技巧

    三、sql技巧

    1 Alter table tabname add column col type
    2 
    3   --注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    

    2.12、说明:使用外连接

    A、left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

     

    3.1、如何删除一个表中重复的记录?

    create table a_dist(id int,name varchar(20))
    
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    
    exec up_distinct 'a_dist','id'
    
    select * from a_dist
    

     存储过程如下:

    新葡亰496net 3新葡亰496net 4

     1 create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))
     2 --f_key表示是分组字段﹐即主键字段
     3 
     4 as
     5 begin
     6 declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer
     7 select @sql = 'declare cur_rows cursor for select ' @f_key ' ,count(*) from '  @t_name  ' group by '  @f_key  ' having count(*) > 1'
     8 exec(@sql)
     9 
    10 open cur_rows
    11 fetch cur_rows into @id,@max
    12 
    13 while @@fetch_status=0
    14 begin
    15 select @max = @max -1
    16 set rowcount @max
    17 select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key
    18 if @type=56
    19 select @sql = 'delete from ' @t_name ' where '   @f_key ' = '  @id
    20 if @type=167
    21 select @sql = 'delete from ' @t_name ' where '   @f_key ' = ' ''''  @id  ''''
    22 exec(@sql)
    23 
    24 fetch cur_rows into @id,@max
    25 end
    26 
    27 close cur_rows
    28 deallocate cur_rows
    29 
    30 set rowcount 0
    31 end
    32 
    33 select * from systypes
    34 select * from syscolumns where id = object_id('a_dist')
    

    View Code

    3.1、如何删除一个表中重复的记录?

    create table a_dist(id int,name varchar(20))
    
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    
    exec up_distinct 'a_dist','id'
    
    select * from a_dist
    

     存储过程如下:

    新葡亰496net 5新葡亰496net 6

     1 create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))
     2 --f_key表示是分组字段﹐即主键字段
     3 
     4 as
     5 begin
     6 declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer
     7 select @sql = 'declare cur_rows cursor for select ' @f_key ' ,count(*) from '  @t_name  ' group by '  @f_key  ' having count(*) > 1'
     8 exec(@sql)
     9 
    10 open cur_rows
    11 fetch cur_rows into @id,@max
    12 
    13 while @@fetch_status=0
    14 begin
    15 select @max = @max -1
    16 set rowcount @max
    17 select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key
    18 if @type=56
    19 select @sql = 'delete from ' @t_name ' where '   @f_key ' = '  @id
    20 if @type=167
    21 select @sql = 'delete from ' @t_name ' where '   @f_key ' = ' ''''  @id  ''''
    22 exec(@sql)
    23 
    24 fetch cur_rows into @id,@max
    25 end
    26 
    27 close cur_rows
    28 deallocate cur_rows
    29 
    30 set rowcount 0
    31 end
    32 
    33 select * from systypes
    34 select * from syscolumns where id = object_id('a_dist')
    

    View Code

      7、说明:添加主键

    补充:

    1)、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

    法一:select * into b from a where 1<>1
    
    法二:select top 0 * into b from a
    

    2)、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

    insert into b(a, b, c) select d,e,f from b; 
    

    3)、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    
    例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..
    

    4)、说明:子查询(表名1:a 表名2:b)

    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) 
    

    5)、说明:显示文章、提交人和最后回复时间

    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    

    6)、说明:外连接查询(表名1:a 表名2:b)

    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 
    

    7)、说明:在线视图查询(表名1:a )

    select * from (SELECT a,b,c FROM a) T where t.a > 1; 
    

    8)、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2
    

    9)、说明:in 的使用方法

    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 
    

    10)、说明:两张关联表,删除主表中已经在副表中没有的信息

    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    

    11)、说明:四表联查问题

    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 
    

    12)、说明:日程安排提前五分钟提醒

    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 
    

    13)、说明:一条sql 语句搞定数据库分页

    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    

    14)、说明:前10条记录

    select top 10 * form table1 where 范围 
    

    15)、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) 
    

    16)、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

    (select a from tableA ) except (select a from tableB) except (select a from tableC) 
    

    17)、说明:随机取出10条数据

    select top 10 * from tablename order by newid() 
    

    18)、说明:随机选择记录

    select newid()
    

    19)、说明:删除重复记录

    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 
    

    20)、说明:列出数据库里所有的表名

    select name from sysobjects where type='U'
    

    21)、说明:列出表里的所有的

    select name from syscolumns where id=object_id('TableName') 
    

    22)、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

    select type,
    sum(case vender when 'A' then pcs else 0 end),
    sum(case vender when 'C' then pcs else 0 end),
    sum(case vender when 'B' then pcs else 0 end)
    FROM tablename group by type
    

    显示结果:

    新葡亰496net 7

    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3
    

    新葡亰496net 8

    23)、说明:初始化表table1

    TRUNCATE TABLE table1 
    

    24)、说明:选择从10到15的记录

    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
    

     

    回到目录

    3.2、查询数据的最大排序问题(只能用一条语句写)

    CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))
    
    insert into hard values ('A','1',3)
    insert into hard values ('A','2',4)
    insert into hard values ('A','4',2)
    insert into hard values ('A','6',9)
    insert into hard values ('B','1',4)
    insert into hard values ('B','2',5)
    insert into hard values ('B','3',6)
    insert into hard values ('C','3',4)
    insert into hard values ('C','6',7)
    insert into hard values ('C','2',3)
    

    要求查询出来的结果如下: 

    qu co je
    ----------- ----------- -----
    A 6 9
    A 2 4
    B 3 6
    B 2 5
    C 6 7
    C 3 4
    
    就是要按qu分组,每组中取je最大的前2位,且只能用一句sql语句。
    
    select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
    

    3.2、查询数据的最大排序问题(只能用一条语句写)

    CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))
    
    insert into hard values ('A','1',3)
    insert into hard values ('A','2',4)
    insert into hard values ('A','4',2)
    insert into hard values ('A','6',9)
    insert into hard values ('B','1',4)
    insert into hard values ('B','2',5)
    insert into hard values ('B','3',6)
    insert into hard values ('C','3',4)
    insert into hard values ('C','6',7)
    insert into hard values ('C','2',3)
    

    要求查询出来的结果如下: 

    qu co je
    ----------- ----------- -----
    A 6 9
    A 2 4
    B 3 6
    B 2 5
    C 6 7
    C 3 4
    
    就是要按qu分组,每组中取je最大的前2位,且只能用一句sql语句。
    
    select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
    
    1 Alter table tabname add primary key(col)
    2 
    3 --说明:删除主键: Alter table tabname drop primary key(col)
    

    三、sql技巧

    3.3、求删除重复记录的sql语句

    怎样把具有相同字段的记录删除,只留下一条。

    例如,表test里有id,name字段

    如果有name相同的记录 只留下一条,其余的删除。

    name的内容不定,相同的记录数不定。

    ==============================

    一个完整的解决方案:

    1)将重复的记录记入temp1表:
    select [标志字段id],count(*) into temp1 from [表名]
    group by [标志字段id]
    having count(*)>1
    
    
    2)将不重复的记录记入temp1表:
    insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1
    
    3)作一个包含所有不重复记录的表:
    select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)
    
    4)删除重复表:
    delete [表名]
    
    5)恢复表:
    insert [表名] select * from temp2
    
    6)删除临时表:
    drop table temp1
    drop table temp2
    

    3.3、求删除重复记录的sql语句

    怎样把具有相同字段的记录删除,只留下一条。

    例如,表test里有id,name字段

    如果有name相同的记录 只留下一条,其余的删除。

    name的内容不定,相同的记录数不定。

    ==============================

    一个完整的解决方案:

    1)将重复的记录记入temp1表:
    select [标志字段id],count(*) into temp1 from [表名]
    group by [标志字段id]
    having count(*)>1
    
    
    2)将不重复的记录记入temp1表:
    insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1
    
    3)作一个包含所有不重复记录的表:
    select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)
    
    4)删除重复表:
    delete [表名]
    
    5)恢复表:
    insert [表名] select * from temp2
    
    6)删除临时表:
    drop table temp1
    drop table temp2
    

      8、说明:创建索引

    3.1、如何删除一个表中重复的记录?

    新葡亰496net 9

    create table a_dist(id int,name varchar(20))
    
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    
    exec up_distinct 'a_dist','id'
    
    select * from a_dist
    

    新葡亰496net 10

     存储过程如下:

    新葡亰496net 11

    新葡亰496net 12

     1 create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))
     2 --f_key表示是分组字段﹐即主键字段
     3 
     4 as
     5 begin
     6 declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer
     7 select @sql = 'declare cur_rows cursor for select ' @f_key ' ,count(*) from '  @t_name  ' group by '  @f_key  ' having count(*) > 1'
     8 exec(@sql)
     9 
    10 open cur_rows
    11 fetch cur_rows into @id,@max
    12 
    13 while @@fetch_status=0
    14 begin
    15 select @max = @max -1
    16 set rowcount @max
    17 select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key
    18 if @type=56
    19 select @sql = 'delete from ' @t_name ' where '   @f_key ' = '  @id
    20 if @type=167
    21 select @sql = 'delete from ' @t_name ' where '   @f_key ' = ' ''''  @id  ''''
    22 exec(@sql)
    23 
    24 fetch cur_rows into @id,@max
    25 end
    26 
    27 close cur_rows
    28 deallocate cur_rows
    29 
    30 set rowcount 0
    31 end
    32 
    33 select * from systypes
    34 select * from syscolumns where id = object_id('a_dist')
    

    新葡亰496net 13

    3.4、行列转换--普通

    假设有张学生成绩表(CJ)如下
    
    Name Subject Result
    张三  语文    80
    张三  数学    90
    张三  物理    85
    李四  语文    85
    李四  数学    92
    李四  物理    82
    
    想变成
    
    姓名 语文 数学 物理
    张三 80   90  85
    李四 85   92  82
    
    declare @sql varchar(4000)
    set @sql = 'select Name'
    
    select @sql = @sql   ',sum(case Subject when ''' Subject ''' then Result end) [' Subject ']'
    from (select distinct Subject from CJ) as a
    
    select @sql = @sql ' from test group by name'
    
    exec(@sql)
    

    3.4、行列转换--普通

    假设有张学生成绩表(CJ)如下
    
    Name Subject Result
    张三  语文    80
    张三  数学    90
    张三  物理    85
    李四  语文    85
    李四  数学    92
    李四  物理    82
    
    想变成
    
    姓名 语文 数学 物理
    张三 80   90  85
    李四 85   92  82
    
    declare @sql varchar(4000)
    set @sql = 'select Name'
    
    select @sql = @sql   ',sum(case Subject when ''' Subject ''' then Result end) [' Subject ']'
    from (select distinct Subject from CJ) as a
    
    select @sql = @sql ' from test group by name'
    
    exec(@sql)
    
    1 create [unique] index idxname on tabname(col….)
    2 
    3 --删除索引:drop index idxname
    4 
    5 --注:索引是不可更改的,想更改必须删除重新建。
    

    3.2、查询数据的最大排序问题(只能用一条语句写)

    新葡亰496net 14

    CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0))
    
    insert into hard values ('A','1',3)
    insert into hard values ('A','2',4)
    insert into hard values ('A','4',2)
    insert into hard values ('A','6',9)
    insert into hard values ('B','1',4)
    insert into hard values ('B','2',5)
    insert into hard values ('B','3',6)
    insert into hard values ('C','3',4)
    insert into hard values ('C','6',7)
    insert into hard values ('C','2',3)
    

    新葡亰496net 15

    要求查询出来的结果如下: 

    新葡亰496net 16

    qu co je
    ----------- ----------- -----
    A 6 9
    A 2 4
    B 3 6
    B 2 5
    C 6 7
    C 3 4
    
    就是要按qu分组,每组中取je最大的前2位,且只能用一句sql语句。
    

    新葡亰496net 17

    select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)
    

    3.5、行列转换--合并

    有表A,
    
    id pid
    1 1
    1 2
    1 3
    2 1
    2 2
    3 1
    
    如何化成表B:
    
    id pid
    1 1,2,3
    2 1,2
    3 1
    

    创建一个合并的函数

    create function fmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    
    select @str=@str ',' cast(pid as varchar) from 表A where id=@id
    set @str=right(@str,len(@str)-1)
    
    return(@str)
    End
    go
    

    调用自定义函数得到结果

    select distinct id,dbo.fmerg(id) from 表A
    

     

    3.5、行列转换--合并

    有表A,
    
    id pid
    1 1
    1 2
    1 3
    2 1
    2 2
    3 1
    
    如何化成表B:
    
    id pid
    1 1,2,3
    2 1,2
    3 1
    

    创建一个合并的函数

    create function fmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    
    select @str=@str ',' cast(pid as varchar) from 表A where id=@id
    set @str=right(@str,len(@str)-1)
    
    return(@str)
    End
    go
    

    调用自定义函数得到结果

    select distinct id,dbo.fmerg(id) from 表A
    

     

      9、说明:创建视图

    3.3、求删除重复记录的sql语句

    怎样把具有相同字段的记录删除,只留下一条。

    例如,表test里有id,name字段

    如果有name相同的记录 只留下一条,其余的删除。

    name的内容不定,相同的记录数不定。

    ==============================

    一个完整的解决方案:

    新葡亰496net 18

    1)将重复的记录记入temp1表:
    select [标志字段id],count(*) into temp1 from [表名]
    group by [标志字段id]
    having count(*)>1
    
    
    2)将不重复的记录记入temp1表:
    insert temp1 select [标志字段id],count(*) from [表名] group by [标志字段id] having count(*)=1
    
    3)作一个包含所有不重复记录的表:
    select * into temp2 from [表名] where 标志字段id in(select 标志字段id from temp1)
    
    4)删除重复表:
    delete [表名]
    
    5)恢复表:
    insert [表名] select * from temp2
    
    6)删除临时表:
    drop table temp1
    drop table temp2
    

    新葡亰496net 19

    3.6、如何取得一个数据表的所有列名

    先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。

    SQL语句如下:

    declare @objid int,@objname char(40)
    set @objname = 'tablename'
    
    
    select @objid = id from sysobjects where id = object_id(@objname)
    select 'Column_name' = name from syscolumns where id = @objid order by colid
    

    或 

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'
    

     

    3.6、如何取得一个数据表的所有列名

    先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。

    SQL语句如下:

    declare @objid int,@objname char(40)
    set @objname = 'tablename'
    
    
    select @objid = id from sysobjects where id = object_id(@objname)
    select 'Column_name' = name from syscolumns where id = @objid order by colid
    

    或 

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'
    

     

    1 create view viewname as select statement
    2 
    3 --删除视图:drop view viewname
    

    3.4、行列转换--普通

    新葡亰496net 20

    假设有张学生成绩表(CJ)如下
    
    Name Subject Result
    张三  语文    80
    张三  数学    90
    张三  物理    85
    李四  语文    85
    李四  数学    92
    李四  物理    82
    
    想变成
    
    姓名 语文 数学 物理
    张三 80   90  85
    李四 85   92  82
    

    新葡亰496net 21

    新葡亰496net 22

    declare @sql varchar(4000)
    set @sql = 'select Name'
    
    select @sql = @sql   ',sum(case Subject when ''' Subject ''' then Result end) [' Subject ']'
    from (select distinct Subject from CJ) as a
    
    select @sql = @sql ' from test group by name'
    
    exec(@sql)
    

    新葡亰496net 23

    3.7、通过SQL语句来更改用户的密码

    修改别人的,需要sysadmin role
    EXEC sp_password NULL, 'newpassword', 'User'
    
    如果帐号为SA执行
    EXEC sp_password NULL, 'newpassword', sa
    

    3.7、通过SQL语句来更改用户的密码

    修改别人的,需要sysadmin role
    EXEC sp_password NULL, 'newpassword', 'User'
    
    如果帐号为SA执行
    EXEC sp_password NULL, 'newpassword', sa
    

      10、说明:几个简单的基本的sql语句

    3.5、行列转换--合并

    新葡亰496net 24

    有表A,
    
    id pid
    1 1
    1 2
    1 3
    2 1
    2 2
    3 1
    
    如何化成表B:
    
    id pid
    1 1,2,3
    2 1,2
    3 1
    

    新葡亰496net 25

    创建一个合并的函数

    新葡亰496net 26

    create function fmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    
    select @str=@str ',' cast(pid as varchar) from 表A where id=@id
    set @str=right(@str,len(@str)-1)
    
    return(@str)
    End
    go
    

    新葡亰496net 27

    调用自定义函数得到结果

    select distinct id,dbo.fmerg(id) from 表A
    

     

    3.8、怎么判断出一个表的哪些字段不允许为空

    select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
    

     

    3.8、怎么判断出一个表的哪些字段不允许为空

    select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
    

     

     1 --选择:
     2         select * from table1 where 范围
     3 
     4 --插入:
     5         insert into table1(field1,field2) values(value1,value2)
     6 
     7 --删除:
     8         delete from table1 where 范围
     9 
    10 --更新:
    11         update table1 set field1=value1 where 范围
    12 
    13 --查找:
    14         select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    15 
    16 --排序:
    17         select * from table1 order by field1,field2 [desc]
    18 
    19 --总数:
    20         select count as totalcount from table1
    21 
    22 --求和:
    23         select sum(field1) as sumvalue from table1
    24 
    25 --平均:
    26         select avg(field1) as avgvalue from table1
    27 
    28 --最大:
    29         select max(field1) as maxvalue from table1
    30 
    31   最小:select min(field1) as minvalue from table1        
    

    3.6、如何取得一个数据表的所有列名

    先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。

    SQL语句如下:

    新葡亰496net 28

    declare @objid int,@objname char(40)
    set @objname = 'tablename'
    
    
    select @objid = id from sysobjects where id = object_id(@objname)
    select 'Column_name' = name from syscolumns where id = @objid order by colid
    

    新葡亰496net 29

    或 

    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'
    

     

    3.9、如何在数据库里找到含有相同字段的表

    a. 查已知列名的情况

    SELECT b.name as TableName,a.name as columnname
    From syscolumns a INNER JOIN sysobjects b
    ON a.id=b.id
    AND b.type='U'
    AND a.name='字段名'
    

     

    b.未知列名查所有在不同表出现过的列名

    Select o.name As tablename,s1.name As columnname
    From syscolumns s1, sysobjects o
    Where s1.id = o.id
    And o.type = 'U'
    And Exists (
    Select 1 From syscolumns s2
    Where s1.name = s2.name
    And s1.id <> s2.id
    )
    

     

    3.9、如何在数据库里找到含有相同字段的表

    a. 查已知列名的情况

    SELECT b.name as TableName,a.name as columnname
    From syscolumns a INNER JOIN sysobjects b
    ON a.id=b.id
    AND b.type='U'
    AND a.name='字段名'
    

     

    b.未知列名查所有在不同表出现过的列名

    Select o.name As tablename,s1.name As columnname
    From syscolumns s1, sysobjects o
    Where s1.id = o.id
    And o.type = 'U'
    And Exists (
    Select 1 From syscolumns s2
    Where s1.name = s2.name
    And s1.id <> s2.id
    )
    

     

      11、说明:几个高级查询运算词

    3.7、通过SQL语句来更改用户的密码

    修改别人的,需要sysadmin role
    EXEC sp_password NULL, 'newpassword', 'User'
    
    如果帐号为SA执行
    EXEC sp_password NULL, 'newpassword', sa
    

    3.10、查询第xxx行数据

    假设id是主键:

    select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) 
    

    如果使用游标也是可以的

    fetch absolute [number] from [cursor_name]
    

     

    注:行数为绝对行数

    3.10、查询第xxx行数据

    假设id是主键:

    select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) 
    

    如果使用游标也是可以的

    fetch absolute [number] from [cursor_name]
    

     

    注:行数为绝对行数

    A: UNION 运算符

    3.8、怎么判断出一个表的哪些字段不允许为空

    select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
    

     

    3.11、日期计算

    a. 一个月的第一天
    SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
    
    b. 本周的星期一
    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
    
    c. 一年的第一天
    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
    
    d. 季度的第一天
    SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
    
    e. 上个月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
    
    f. 去年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
    
    g. 本月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()) 1, 0))
    
    h. 本月的第一个星期一
    select DATEADD(wk, DATEDIFF(wk,0,
    dateadd(dd,6-datepart(day,getdate()),getdate())
    ), 0)
    
    i. 本年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()) 1, 0))。
    

     

    3.11、日期计算

    a. 一个月的第一天
    SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
    
    b. 本周的星期一
    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
    
    c. 一年的第一天
    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
    
    d. 季度的第一天
    SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
    
    e. 上个月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
    
    f. 去年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
    
    g. 本月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()) 1, 0))
    
    h. 本月的第一个星期一
    select DATEADD(wk, DATEDIFF(wk,0,
    dateadd(dd,6-datepart(day,getdate()),getdate())
    ), 0)
    
    i. 本年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()) 1, 0))。
    

     

      UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    3.9、如何在数据库里找到含有相同字段的表

    a. 查已知列名的情况

    SELECT b.name as TableName,a.name as columnname
    From syscolumns a INNER JOIN sysobjects b
    ON a.id=b.id
    AND b.type='U'
    AND a.name='字段名'
    

     

    b.未知列名查所有在不同表出现过的列名

    新葡亰496net 30

    Select o.name As tablename,s1.name As columnname
    From syscolumns s1, sysobjects o
    Where s1.id = o.id
    And o.type = 'U'
    And Exists (
    Select 1 From syscolumns s2
    Where s1.name = s2.name
    And s1.id <> s2.id
    )
    

    新葡亰496net 31

     

    3.12、获取表结构[把 'sysobjects' 替换 成 'tablename' 即可]

    SELECT CASE IsNull(I.name, '')
    When '' Then ''
    Else '*'
    End as IsPK,
    Object_Name(A.id) as t_name,
    A.name as c_name,
    IsNull(SubString(M.text, 1, 254), '') as pbc_init,
    T.name as F_DataType,
    CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '')
    WHEN '' Then Cast(A.prec as varchar)
    ELSE Cast(A.prec as varchar)   ','   Cast(A.scale as varchar)
    END as F_Scale,
    A.isnullable as F_isNullAble
    FROM Syscolumns as A
    JOIN Systypes as T
    ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') )
    LEFT JOIN ( SysIndexes as I
    JOIN Syscolumns as A1
    ON ( I.id = A1.id and A1.id = object_id('sysobjects') and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) )
    ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) )
    LEFT JOIN SysComments as M
    ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint') = 1 )
    ORDER BY A.Colid ASC
    

    3.12、获取表结构[把 'sysobjects' 替换 成 'tablename' 即可]

    SELECT CASE IsNull(I.name, '')
    When '' Then ''
    Else '*'
    End as IsPK,
    Object_Name(A.id) as t_name,
    A.name as c_name,
    IsNull(SubString(M.text, 1, 254), '') as pbc_init,
    T.name as F_DataType,
    CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '')
    WHEN '' Then Cast(A.prec as varchar)
    ELSE Cast(A.prec as varchar)   ','   Cast(A.scale as varchar)
    END as F_Scale,
    A.isnullable as F_isNullAble
    FROM Syscolumns as A
    JOIN Systypes as T
    ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') )
    LEFT JOIN ( SysIndexes as I
    JOIN Syscolumns as A1
    ON ( I.id = A1.id and A1.id = object_id('sysobjects') and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) )
    ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) )
    LEFT JOIN SysComments as M
    ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint') = 1 )
    ORDER BY A.Colid ASC
    

    B: EXCEPT 运算符

    3.10、查询第xxx行数据

    假设id是主键:

    select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) 
    

    如果使用游标也是可以的

    fetch absolute [number] from [cursor_name]
    

     

    注:行数为绝对行数

    3.13、提取数据库内所有表的字段详细说明的SQL语句

    SELECT
    (case when a.colorder=1 then d.name else '' end) N'表名',
    a.colorder N'字段序号',
    a.name N'字段名',
    (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else ''
    end) N'标识',
    (case when (SELECT count(*)
    FROM sysobjects
    WHERE (name in
    (SELECT name
    FROM sysindexes
    WHERE (id = a.id) AND (indid in
    (SELECT indid
    FROM sysindexkeys
    WHERE (id = a.id) AND (colid in
    (SELECT colid
    FROM syscolumns
    WHERE (id = a.id) AND (name = a.name))))))) AND
    (xtype = 'PK'))>0 then '√' else '' end) N'主键',
    b.name N'类型',
    a.length N'占用字节数',
    COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度',
    isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数',
    (case when a.isnullable=1 then '√'else '' end) N'允许空',
    isnull(e.text,'') N'默认值',
    isnull(g.[value],'') AS N'字段说明'
    FROM syscolumns a
    left join systypes b
    on a.xtype=b.xusertype
    inner join sysobjects d
    on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
    left join syscomments e
    on a.cdefault=e.id
    left join sysproperties g
    on a.id=g.id AND a.colid = g.smallid
    order by object_name(a.id),a.colorder
    

    3.13、提取数据库内所有表的字段详细说明的SQL语句

    SELECT
    (case when a.colorder=1 then d.name else '' end) N'表名',
    a.colorder N'字段序号',
    a.name N'字段名',
    (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else ''
    end) N'标识',
    (case when (SELECT count(*)
    FROM sysobjects
    WHERE (name in
    (SELECT name
    FROM sysindexes
    WHERE (id = a.id) AND (indid in
    (SELECT indid
    FROM sysindexkeys
    WHERE (id = a.id) AND (colid in
    (SELECT colid
    FROM syscolumns
    WHERE (id = a.id) AND (name = a.name))))))) AND
    (xtype = 'PK'))>0 then '√' else '' end) N'主键',
    b.name N'类型',
    a.length N'占用字节数',
    COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度',
    isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数',
    (case when a.isnullable=1 then '√'else '' end) N'允许空',
    isnull(e.text,'') N'默认值',
    isnull(g.[value],'') AS N'字段说明'
    FROM syscolumns a
    left join systypes b
    on a.xtype=b.xusertype
    inner join sysobjects d
    on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
    left join syscomments e
    on a.cdefault=e.id
    left join sysproperties g
    on a.id=g.id AND a.colid = g.smallid
    order by object_name(a.id),a.colorder
    

      EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    3.11、日期计算

    新葡亰496net 32

    a. 一个月的第一天
    SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
    
    b. 本周的星期一
    SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
    
    c. 一年的第一天
    SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
    
    d. 季度的第一天
    SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
    
    e. 上个月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
    
    f. 去年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
    
    g. 本月的最后一天
    SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()) 1, 0))
    
    h. 本月的第一个星期一
    select DATEADD(wk, DATEDIFF(wk,0,
    dateadd(dd,6-datepart(day,getdate()),getdate())
    ), 0)
    
    i. 本年的最后一天
    SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()) 1, 0))。
    

    新葡亰496net 33

     

    3.14、快速获取表test的记录总数[对大容量表非常有效]

    快速获取表test的记录总数:

    select rows from sysindexes where id = object_id('test') and indid in (0,1)
    
    update 2 set KHXH=(ID 1)2 2行递增编号
    update [23] set id1 = 'No.' right('00000000' id,6) where id not like 'No%' //递增
    update [23] set id1= 'No.' right('00000000' replace(id1,'No.',''),6) //补位递增
    delete from [1] where (id%2)=1
    
    
    奇数
    替换表名字段
    update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%'
    
    截位
    SELECT LEFT(表名, 5)
    
    截位
    SELECT LEFT(表名, 5)
    

    3.14、快速获取表test的记录总数[对大容量表非常有效]

    快速获取表test的记录总数:

    select rows from sysindexes where id = object_id('test') and indid in (0,1)
    
    update 2 set KHXH=(ID 1)2 2行递增编号
    update [23] set id1 = 'No.' right('00000000' id,6) where id not like 'No%' //递增
    update [23] set id1= 'No.' right('00000000' replace(id1,'No.',''),6) //补位递增
    delete from [1] where (id%2)=1
    
    
    奇数
    替换表名字段
    update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%'
    
    截位
    SELECT LEFT(表名, 5)
    
    截位
    SELECT LEFT(表名, 5)
    

    C: INTERSECT 运算符

    3.12、获取表结构[把 'sysobjects' 替换 成 'tablename' 即可]

    新葡亰496net 34

    SELECT CASE IsNull(I.name, '')
    When '' Then ''
    Else '*'
    End as IsPK,
    Object_Name(A.id) as t_name,
    A.name as c_name,
    IsNull(SubString(M.text, 1, 254), '') as pbc_init,
    T.name as F_DataType,
    CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '')
    WHEN '' Then Cast(A.prec as varchar)
    ELSE Cast(A.prec as varchar)   ','   Cast(A.scale as varchar)
    END as F_Scale,
    A.isnullable as F_isNullAble
    FROM Syscolumns as A
    JOIN Systypes as T
    ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') )
    LEFT JOIN ( SysIndexes as I
    JOIN Syscolumns as A1
    ON ( I.id = A1.id and A1.id = object_id('sysobjects') and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) )
    ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) )
    LEFT JOIN SysComments as M
    ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint') = 1 )
    ORDER BY A.Colid ASC
    

    新葡亰496net 35

    四、(MS SQL Server)SQL语句导入导出大全

    四、(MS SQL Server)SQL语句导入导出大全

      INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。

    3.13、提取数据库内所有表的字段详细说明的SQL语句

    新葡亰496net 36

    SELECT
    (case when a.colorder=1 then d.name else '' end) N'表名',
    a.colorder N'字段序号',
    a.name N'字段名',
    (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else ''
    end) N'标识',
    (case when (SELECT count(*)
    FROM sysobjects
    WHERE (name in
    (SELECT name
    FROM sysindexes
    WHERE (id = a.id) AND (indid in
    (SELECT indid
    FROM sysindexkeys
    WHERE (id = a.id) AND (colid in
    (SELECT colid
    FROM syscolumns
    WHERE (id = a.id) AND (name = a.name))))))) AND
    (xtype = 'PK'))>0 then '√' else '' end) N'主键',
    b.name N'类型',
    a.length N'占用字节数',
    COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'长度',
    isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小数位数',
    (case when a.isnullable=1 then '√'else '' end) N'允许空',
    isnull(e.text,'') N'默认值',
    isnull(g.[value],'') AS N'字段说明'
    FROM syscolumns a
    left join systypes b
    on a.xtype=b.xusertype
    inner join sysobjects d
    on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
    left join syscomments e
    on a.cdefault=e.id
    left join sysproperties g
    on a.id=g.id AND a.colid = g.smallid
    order by object_name(a.id),a.colorder
    

    新葡亰496net 37

    4.1、导出到excel

    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
    

     

    4.1、导出到excel

    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
    

     

      注:使用运算词的几个查询结果行必须是一致的。

    3.14、快速获取表test的记录总数[对大容量表非常有效]

    快速获取表test的记录总数:

    新葡亰496net 38

    select rows from sysindexes where id = object_id('test') and indid in (0,1)
    
    update 2 set KHXH=(ID 1)2 2行递增编号
    update [23] set id1 = 'No.' right('00000000' id,6) where id not like 'No%' //递增
    update [23] set id1= 'No.' right('00000000' replace(id1,'No.',''),6) //补位递增
    delete from [1] where (id%2)=1
    
    
    奇数
    替换表名字段
    update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%'
    
    截位
    SELECT LEFT(表名, 5)
    
    截位
    SELECT LEFT(表名, 5)
    

    新葡亰496net 39

    回到目录

    4.2、 导入Excel

    SELECT *
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    
    SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255)) ' ' 转换后的别名
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    
    select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:Book1.xls',Sheet1$)
    
    HDR=YES;Excel第一行当成标题行
    HDR=NO;第一行不当成标题行
    

    4.2、 导入Excel

    SELECT *
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    
    SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255)) ' ' 转换后的别名
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    
    select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:Book1.xls',Sheet1$)
    
    HDR=YES;Excel第一行当成标题行
    HDR=NO;第一行不当成标题行
    

      12、说明:使用外连接

    四、(MS SQL Server)SQL语句导入导出大全

    4.3、 导入文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword' 
    

    4.3、 导入文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword' 
    
     1 A、left (outer) join:
     2 
     3 --左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
     4 
     5   SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
     6 
     7 B:right (outer) join:
     8 
     9 --右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    10 
    11 C:full/cross (outer) join:
    12 
    13 --全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
    

    4.1、导出到excel

    EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
    

     

    4.4、 导出文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword'
    或
    EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:DT.txt -c -Sservername -Usa -Ppassword'
    
    导出到TXT文本,用逗号分开
    exec master..xp_cmdshell 'bcp "库名..表名" out "d:tt.txt" -c -t ,-U sa -P password'
    
    
    BULK INSERT 库名..表名
    FROM 'c:test.txt'
    WITH (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = 'n'
    )
    

     

     补充:

    --/* dBase IV文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:','select * from [客户资料4.dbf]')
    --*/
    
    --/* dBase III文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:','select * from [客户资料3.dbf]')
    --*/
    
    --/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',
    'select * from [aa.DBF]')
    --*/
    

    4.4、 导出文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword'
    或
    EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:DT.txt -c -Sservername -Usa -Ppassword'
    
    导出到TXT文本,用逗号分开
    exec master..xp_cmdshell 'bcp "库名..表名" out "d:tt.txt" -c -t ,-U sa -P password'
    
    
    BULK INSERT 库名..表名
    FROM 'c:test.txt'
    WITH (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = 'n'
    )
    

     

     补充:

    --/* dBase IV文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:','select * from [客户资料4.dbf]')
    --*/
    
    --/* dBase III文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:','select * from [客户资料3.dbf]')
    --*/
    
    --/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',
    'select * from [aa.DBF]')
    --*/
    

      12、分组:Group by

    4.2、 导入Excel

    新葡亰496net 40

    SELECT *
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    
    SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255)) ' ' 转换后的别名
    FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
    'Data Source="c:test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
    
    select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:Book1.xls',Sheet1$)
    
    HDR=YES;Excel第一行当成标题行
    HDR=NO;第一行不当成标题行
    

    新葡亰496net 41

    4.5、导入DBF文件

    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:VFP98data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    

     

    4.5、导入DBF文件

    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:VFP98data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    

     

      一张表,一旦分组 完成后,查询后只能得到组相关的信息。

    4.3、 导入文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword' 
    

    4.6、 导出到DBF 文件

    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

    insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',
    'select * from [aa.DBF]')
    
    select * from 表
    

     

    说明:

    SourceDB=c: 指定foxpro表所在的文件夹

    aa.DBF 指定foxpro表的文件名.

     

    4.6、 导出到DBF 文件

    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

    insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',
    'select * from [aa.DBF]')
    
    select * from 表
    

    新葡亰496net, 

    说明:

    SourceDB=c: 指定foxpro表所在的文件夹

    aa.DBF 指定foxpro表的文件名.

     

      组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)

    4.4、 导出文本文件

    新葡亰496net 42

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword'
    或
    EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:DT.txt -c -Sservername -Usa -Ppassword'
    
    导出到TXT文本,用逗号分开
    exec master..xp_cmdshell 'bcp "库名..表名" out "d:tt.txt" -c -t ,-U sa -P password'
    
    
    BULK INSERT 库名..表名
    FROM 'c:test.txt'
    WITH (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = 'n'
    )
    

    新葡亰496net 43

     

     补充:

    新葡亰496net 44

    --/* dBase IV文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:','select * from [客户资料4.dbf]')
    --*/
    
    --/* dBase III文件
    select * from
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:','select * from [客户资料3.dbf]')
    --*/
    
    --/* FoxPro 数据库
    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',
    'select * from [aa.DBF]')
    --*/
    

    新葡亰496net 45

    4.7、导出到Access

    insert into openrowset('Microsoft.Jet.OLEDB.4.0',
    'x:A.mdb';'admin';'',A表) select * from 数据库名..B表
    

    4.7、导出到Access

    insert into openrowset('Microsoft.Jet.OLEDB.4.0',
    'x:A.mdb';'admin';'',A表) select * from 数据库名..B表
    

      在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据

    4.5、导入DBF文件

    新葡亰496net 46

    select * from openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;
    SourceDB=e:VFP98data;
    SourceType=DBF',
    'select * from customer where country != "USA" order by country')
    go
    

    新葡亰496net 47

     

    4.8、导入Access

    insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
    'x:A.mdb';'admin';'',A表)
    

    4.8、导入Access

    insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
    'x:A.mdb';'admin';'',A表)
    

      在selecte统计函数中的字段,不能和普通的字段放在一起;

    4.6、 导出到DBF 文件

    如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

    insert into openrowset('MSDASQL',
    'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:',
    'select * from [aa.DBF]')
    
    select * from 表
    

     

    说明:

    SourceDB=c: 指定foxpro表所在的文件夹

    aa.DBF 指定foxpro表的文件名.

     

    4.9、 导入 xml文件

     

    新葡亰496net 48新葡亰496net 49

     1 DECLARE @idoc int
     2 DECLARE @doc varchar(1000)
     3 
     4 --sample XML document
     5 SET @doc ='
     6 <root>
     7 <Customer cid= "C1" name="Janine" city="Issaquah">
     8 <Order oid="O1" date="1/20/1996" amount="3.5" />
     9 <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
    10 </Order>
    11 </Customer>
    12 <Customer cid="C2" name="Ursula" city="Oelde" >
    13 <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
    14 white red">
    15 <Urgency>Important</Urgency>
    16 Happy Customer.
    17 </Order>
    18 <Order oid="O4" date="1/20/1996" amount="10000"/>
    19 </Customer>
    20 </root>
    21 '
    22 
    23 -- Create an internal representation of the XML document.
    24 EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    25 
    26 
    27 -- Execute a SELECT statement using OPENXML rowset provider.
    28 SELECT *
    29 FROM OPENXML (@idoc, '/root/Customer/Order', 1)
    30 WITH (oid char(5),
    31 amount float,
    32 comment ntext 'text()')
    33 
    34 EXEC sp_xml_removedocument @idoc
    

    View Code

     

     

     

    4.9、 导入 xml文件

     

    新葡亰496net 50新葡亰496net 51

     1 DECLARE @idoc int
     2 DECLARE @doc varchar(1000)
     3 
     4 --sample XML document
     5 SET @doc ='
     6 <root>
     7 <Customer cid= "C1" name="Janine" city="Issaquah">
     8 <Order oid="O1" date="1/20/1996" amount="3.5" />
     9 <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
    10 </Order>
    11 </Customer>
    12 <Customer cid="C2" name="Ursula" city="Oelde" >
    13 <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
    14 white red">
    15 <Urgency>Important</Urgency>
    16 Happy Customer.
    17 </Order>
    18 <Order oid="O4" date="1/20/1996" amount="10000"/>
    19 </Customer>
    20 </root>
    21 '
    22 
    23 -- Create an internal representation of the XML document.
    24 EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    25 
    26 
    27 -- Execute a SELECT statement using OPENXML rowset provider.
    28 SELECT *
    29 FROM OPENXML (@idoc, '/root/Customer/Order', 1)
    30 WITH (oid char(5),
    31 amount float,
    32 comment ntext 'text()')
    33 
    34 EXEC sp_xml_removedocument @idoc
    

    View Code

     

     

     

      13、对数据库进行操作

    4.7、导出到Access

    insert into openrowset('Microsoft.Jet.OLEDB.4.0',
    'x:A.mdb';'admin';'',A表) select * from 数据库名..B表
    

    4.10、导整个数据库

    用bcp实现的存储过程

    实现数据导入/导出的存储过程

    根据不同的参数,可以实现导入/导出整个数据库/单个表

    调用示例:

    4.10、导整个数据库

    用bcp实现的存储过程

    实现数据导入/导出的存储过程

    根据不同的参数,可以实现导入/导出整个数据库/单个表

    调用示例:

      分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名

    4.8、导入Access

    insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0',
    'x:A.mdb';'admin';'',A表)
    

    4.10.1、导出调用示例

    ----导出单个表

    exec file2table 'zj','','','xzkh_sa..地区资料','c:zj.txt',1
    

     

    ----导出整个数据库

    exec file2table 'zj','','','xzkh_sa','C:docman',1 
    

    4.10.1、导出调用示例

    ----导出单个表

    exec file2table 'zj','','','xzkh_sa..地区资料','c:zj.txt',1
    

     

    ----导出整个数据库

    exec file2table 'zj','','','xzkh_sa','C:docman',1 
    

      14.如何修改数据库的名称

    4.9、 导入 xml文件

     

    新葡亰496net 52

    新葡亰496net 53

     1 DECLARE @idoc int
     2 DECLARE @doc varchar(1000)
     3 
     4 --sample XML document
     5 SET @doc ='
     6 <root>
     7 <Customer cid= "C1" name="Janine" city="Issaquah">
     8 <Order oid="O1" date="1/20/1996" amount="3.5" />
     9 <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
    10 </Order>
    11 </Customer>
    12 <Customer cid="C2" name="Ursula" city="Oelde" >
    13 <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
    14 white red">
    15 <Urgency>Important</Urgency>
    16 Happy Customer.
    17 </Order>
    18 <Order oid="O4" date="1/20/1996" amount="10000"/>
    19 </Customer>
    20 </root>
    21 '
    22 
    23 -- Create an internal representation of the XML document.
    24 EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
    25 
    26 
    27 -- Execute a SELECT statement using OPENXML rowset provider.
    28 SELECT *
    29 FROM OPENXML (@idoc, '/root/Customer/Order', 1)
    30 WITH (oid char(5),
    31 amount float,
    32 comment ntext 'text()')
    33 
    34 EXEC sp_xml_removedocument @idoc
    

    新葡亰496net 54

     

     

     

    4.10.2、导入调用示例

    ----导入单个表

    exec file2table 'zj','','','xzkh_sa..地区资料','c:zj.txt',0
    

     

    ----导入整个数据库

    exec file2table 'zj','','','xzkh_sa','C:docman',0 
    

    4.10.2、导入调用示例

    ----导入单个表

    exec file2table 'zj','','','xzkh_sa..地区资料','c:zj.txt',0
    

     

    ----导入整个数据库

    exec file2table 'zj','','','xzkh_sa','C:docman',0 
    
    1 sp_renamedb 'old_name', 'new_name'
    

    4.10、导整个数据库

    用bcp实现的存储过程

    实现数据导入/导出的存储过程

    根据不同的参数,可以实现导入/导出整个数据库/单个表

    调用示例:

     

    新葡亰496net 55新葡亰496net 56

     1 if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
     2 drop procedure File2Table
     3 go
     4 create procedure File2Table
     5 @servername varchar(200) --服务器名
     6 ,@username varchar(200) --用户名,如果用NT验证方式,则为空''
     7 ,@password varchar(200) --密码
     8 ,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
     9 ,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
    10 ,@isout bit --1为导出,0为导入
    11 as
    12 declare @sql varchar(8000)
    13 if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
    14 begin
    15 set @sql='bcp ' @tbname
    16  case when @isout=1 then ' out ' else ' in ' end
    17  ' "' @filename '" /w'
    18  ' /S ' @servername
    19  case when isnull(@username,'')='' then '' else ' /U ' @username end
    20  ' /P ' isnull(@password,'')
    21 
    22 exec master..xp_cmdshell @sql
    23 
    24 end
    25 else
    26 begin --导出整个数据库,定义游标,取出所有的用户表
    27 
    28 declare @m_tbname varchar(250)
    29 if right(@filename,1)<>'' set @filename=@filename ''
    30 set @m_tbname='declare #tb cursor for select name from ' @tbname '..sysobjects where xtype=''U'''
    31 exec(@m_tbname)
    32 
    33 open #tb
    34 
    35 fetch next from #tb into @m_tbname
    36 while @@fetch_status=0
    37 begin
    38 set @sql='bcp ' @tbname '..' @m_tbname
    39  case when @isout=1 then ' out ' else ' in ' end
    40  ' "' @filename @m_tbname '.txt " /w'
    41  ' /S ' @servername
    42  case when isnull(@username,'')='' then '' else ' /U ' @username end
    43  ' /P ' isnull(@password,'')
    44 
    45 exec master..xp_cmdshell @sql
    46 
    47 fetch next from #tb into @m_tbname
    48 end
    49 
    50 close #tb
    51 deallocate #tb
    52 end
    53 go
    

    View Code

     

    新葡亰496net 57新葡亰496net 58

     1 if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
     2 drop procedure File2Table
     3 go
     4 create procedure File2Table
     5 @servername varchar(200) --服务器名
     6 ,@username varchar(200) --用户名,如果用NT验证方式,则为空''
     7 ,@password varchar(200) --密码
     8 ,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
     9 ,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
    10 ,@isout bit --1为导出,0为导入
    11 as
    12 declare @sql varchar(8000)
    13 if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
    14 begin
    15 set @sql='bcp ' @tbname
    16  case when @isout=1 then ' out ' else ' in ' end
    17  ' "' @filename '" /w'
    18  ' /S ' @servername
    19  case when isnull(@username,'')='' then '' else ' /U ' @username end
    20  ' /P ' isnull(@password,'')
    21 
    22 exec master..xp_cmdshell @sql
    23 
    24 end
    25 else
    26 begin --导出整个数据库,定义游标,取出所有的用户表
    27 
    28 declare @m_tbname varchar(250)
    29 if right(@filename,1)<>'' set @filename=@filename ''
    30 set @m_tbname='declare #tb cursor for select name from ' @tbname '..sysobjects where xtype=''U'''
    31 exec(@m_tbname)
    32 
    33 open #tb
    34 
    35 fetch next from #tb into @m_tbname
    36 while @@fetch_status=0
    37 begin
    38 set @sql='bcp ' @tbname '..' @m_tbname
    39  case when @isout=1 then ' out ' else ' in ' end
    40  ' "' @filename @m_tbname '.txt " /w'
    41  ' /S ' @servername
    42  case when isnull(@username,'')='' then '' else ' /U ' @username end
    43  ' /P ' isnull(@password,'')
    44 
    45 exec master..xp_cmdshell @sql
    46 
    47 fetch next from #tb into @m_tbname
    48 end
    49 
    50 close #tb
    51 deallocate #tb
    52 end
    53 go
    

    View Code

    一、提升

    4.10.1、导出调用示例

    ----导出单个表

    exec file2table 'zj','','','xzkh_sa..地区资料','c:zj.txt',1
    

     

    ----导出整个数据库

    exec file2table 'zj','','','xzkh_sa','C:docman',1 
    

     

     

     

     

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

    4.10.2、导入调用示例

    ----导入单个表

    exec file2table 'zj','','','xzkh_sa..地区资料','c:zj.txt',0
    

     

    ----导入整个数据库

    exec file2table 'zj','','','xzkh_sa','C:docman',0 
    

     

     

    1 方法一:
    2     select * into b from a where 1<>1(仅用于SQlServer)
    3 
    4 方法二:
    5     select top 0 * into b from a
    

     

    新葡亰496net 59

    新葡亰496net 60

     1 if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)
     2 drop procedure File2Table
     3 go
     4 create procedure File2Table
     5 @servername varchar(200) --服务器名
     6 ,@username varchar(200) --用户名,如果用NT验证方式,则为空''
     7 ,@password varchar(200) --密码
     8 ,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
     9 ,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
    10 ,@isout bit --1为导出,0为导入
    11 as
    12 declare @sql varchar(8000)
    13 if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表
    14 begin
    15 set @sql='bcp ' @tbname
    16  case when @isout=1 then ' out ' else ' in ' end
    17  ' "' @filename '" /w'
    18  ' /S ' @servername
    19  case when isnull(@username,'')='' then '' else ' /U ' @username end
    20  ' /P ' isnull(@password,'')
    21 
    22 exec master..xp_cmdshell @sql
    23 
    24 end
    25 else
    26 begin --导出整个数据库,定义游标,取出所有的用户表
    27 
    28 declare @m_tbname varchar(250)
    29 if right(@filename,1)<>'' set @filename=@filename ''
    30 set @m_tbname='declare #tb cursor for select name from ' @tbname '..sysobjects where xtype=''U'''
    31 exec(@m_tbname)
    32 
    33 open #tb
    34 
    35 fetch next from #tb into @m_tbname
    36 while @@fetch_status=0
    37 begin
    38 set @sql='bcp ' @tbname '..' @m_tbname
    39  case when @isout=1 then ' out ' else ' in ' end
    40  ' "' @filename @m_tbname '.txt " /w'
    41  ' /S ' @servername
    42  case when isnull(@username,'')='' then '' else ' /U ' @username end
    43  ' /P ' isnull(@password,'')
    44 
    45 exec master..xp_cmdshell @sql
    46 
    47 fetch next from #tb into @m_tbname
    48 end
    49 
    50 close #tb
    51 deallocate #tb
    52 end
    53 go
    

    新葡亰496net 61

    4.11、Excel导到Txt

    想用

    select * into opendatasource(...) from opendatasource(...)

    实现将一个Excel文件内容导入到一个文本文件

     

    假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)

    且银行帐号导出到文本文件后分两部分,前8位和后8位分开。

     

    如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2

    然后就可以用下面的语句进行插入

    注意文件名和目录根据你的实际情况进行修改.

    insert into
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Text;HDR=Yes;DATABASE=C:'
    )...[aa#txt]
    --,aa#txt)
    --*/
    
    select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    from
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls'
    --,Sheet1$)
    )...[Sheet1$]
    

     

     

    如果你想直接插入并生成文本文件,就要用bcp

    declare @sql varchar(8000),@tbname varchar(50) 
    

    首先将excel表内容导入到一个全局临时表

    select @tbname='[##temp' cast(newid() as varchar(40)) ']'
    ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    into ' @tbname ' from
    opendatasource(''MICROSOFT.JET.OLEDB.4.0''
    ,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls''
    )...[Sheet1$]'
    
    exec(@sql)
    

    然后用bcp从全局临时表导出到文本文件

    set @sql='bcp "' @tbname '" out "c:aa.txt" /S"(local)" /P"" /c'
    exec master..xp_cmdshell @sql
    

    删除临时表

    exec('drop table ' @tbname) 
    

    4.11、Excel导到Txt

    想用

    select * into opendatasource(...) from opendatasource(...)

    实现将一个Excel文件内容导入到一个文本文件

    常用语法,sql语句语法。 

    假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)

    且银行帐号导出到文本文件后分两部分,前8位和后8位分开。

     

    如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2

    然后就可以用下面的语句进行插入

    注意文件名和目录根据你的实际情况进行修改.

    insert into
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Text;HDR=Yes;DATABASE=C:'
    )...[aa#txt]
    --,aa#txt)
    --*/
    
    select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    from
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls'
    --,Sheet1$)
    )...[Sheet1$]
    

     

     

    如果你想直接插入并生成文本文件,就要用bcp

    declare @sql varchar(8000),@tbname varchar(50) 
    

    首先将excel表内容导入到一个全局临时表

    select @tbname='[##temp' cast(newid() as varchar(40)) ']'
    ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    into ' @tbname ' from
    opendatasource(''MICROSOFT.JET.OLEDB.4.0''
    ,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls''
    )...[Sheet1$]'
    
    exec(@sql)
    

    然后用bcp从全局临时表导出到文本文件

    set @sql='bcp "' @tbname '" out "c:aa.txt" /S"(local)" /P"" /c'
    exec master..xp_cmdshell @sql
    

    删除临时表

    exec('drop table ' @tbname) 
    

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

     

     

    4.12、用bcp将文件导入导出到数据库的存储过程:

    bcp-二进制文件的导入导出

    支持image,text,ntext字段的导入/导出

    image适合于二进制文件;text,ntext适合于文本数据文件

     

    注意:导入时,将覆盖满足条件的所有行

    导出时,将把所有满足条件的行也出到指定文件中

     

    此存储过程仅用bcp实现

     

    /*--调用示例

    --数据导出

    exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:zj1.dat' 
    

    --数据导出

    exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:zj1.dat','',0
    

     

    --*/

     

    新葡亰496net 62新葡亰496net 63

     1 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
     2 drop procedure [dbo].[p_binaryIO]
     3 GO
     4 
     5 Create proc p_binaryIO
     6 @servename varchar (30),--服务器名称
     7 @username varchar (30), --用户名
     8 @password varchar (30), --密码
     9 @tbname varchar (500), --数据库..表名
    10 @fdname varchar (30), --字段名
    11 @fname varchar (1000), --目录 文件名,处理过程中要使用/覆盖:@filename .bak
    12 @tj varchar (1000)='', --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀
    13 @isout bit=1 --1导出((默认),0导入
    14 AS
    15 declare @fname_in varchar(1000) --bcp处理应答文件名
    16 ,@fsize varchar(20) --要处理的文件的大小
    17 ,@m_tbname varchar(50) --临时表名
    18 ,@sql varchar(8000)
    19 
    20 --则取得导入文件的大小
    21 
    22 if @isout=1
    23 set @fsize='0'
    24 else
    25 begin
    26 create table #tb(可选名 varchar(20),大小 int
    27 ,创建日期 varchar(10),创建时间 varchar(20)
    28 ,上次写操作日期 varchar(10),上次写操作时间 varchar(20)
    29 ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)
    30 
    31 insert into #tb
    32 exec master..xp_getfiledetails @fname
    33 
    34 select @fsize=大小 from #tb
    35 drop table #tb
    36 
    37 if @fsize is null
    38 begin
    39 print '文件未找到'
    40 return
    41 end
    42 end
    

    View Code

     

     生成数据处理应答文件

    set @m_tbname='[##temp' cast(newid() as varchar(40)) ']'
    set @sql='select * into ' @m_tbname ' from(
    select null as 类型
    union all select 0 as 前缀
    union all select ' @fsize ' as 长度
    union all select null as 结束
    union all select null as 格式
    ) a'
    
    exec(@sql)
    
    select @fname_in=@fname '_temp'
    ,@sql='bcp "' @m_tbname '" out "' @fname_in
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'') '" /c'
    
    exec master..xp_cmdshell @sql
    

     

    删除临时表

    set @sql='drop table ' @m_tbname
    exec(@sql)
    
    if @isout=1
    begin
    set @sql='bcp "select top 1 ' @fdname ' from '
     @tbname case isnull(@tj,'') when '' then ''
    else ' where ' @tj end
     '" queryout "' @fname
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'')
     '" /i"' @fname_in '"'
    
    
    exec master..xp_cmdshell @sql
    end
    else
    begin
    

     

    为数据导入准备临时表

    set @sql='select top 0 ' @fdname ' into '
     @m_tbname ' from '  @tbname
    
    exec(@sql)
    

    将数据导入到临时表

    set @sql='bcp "' @m_tbname '" in "' @fname
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'')
     '" /i"' @fname_in '"'
    
    exec master..xp_cmdshell @sql
    

     

     将数据导入到正式表中

    set @sql='update ' @tbname
     ' set ' @fdname '=b.' @fdname
     ' from ' @tbname ' a,'
     @m_tbname ' b'
     case isnull(@tj,'') when '' then ''
    else ' where ' @tj end
    
    exec(@sql)
    

    删除数据处理临时表

    set @sql='drop table ' @m_tbname
    end
    

    删除数据处理应答文件

    set @sql='del ' @fname_in
    
    exec master..xp_cmdshell @sql
    go
    

     

     导入文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword'
    
    改为如下,不需引号
    
    EXEC master..xp_cmdshell 'bcp dbname..tablename in c:DT.txt -c -Sservername -Usa -Ppassword'
    

    导出文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword'
    
    此句需加引号
    

     

     

    4.12、用bcp将文件导入导出到数据库的存储过程:

    bcp-二进制文件的导入导出

    支持image,text,ntext字段的导入/导出

    image适合于二进制文件;text,ntext适合于文本数据文件

     

    注意:导入时,将覆盖满足条件的所有行

    导出时,将把所有满足条件的行也出到指定文件中

     

    此存储过程仅用bcp实现

     

    /*--调用示例

    --数据导出

    exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:zj1.dat' 
    

    --数据导出

    exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:zj1.dat','',0
    

     

    --*/

     

    新葡亰496net 64新葡亰496net 65

     1 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
     2 drop procedure [dbo].[p_binaryIO]
     3 GO
     4 
     5 Create proc p_binaryIO
     6 @servename varchar (30),--服务器名称
     7 @username varchar (30), --用户名
     8 @password varchar (30), --密码
     9 @tbname varchar (500), --数据库..表名
    10 @fdname varchar (30), --字段名
    11 @fname varchar (1000), --目录 文件名,处理过程中要使用/覆盖:@filename .bak
    12 @tj varchar (1000)='', --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀
    13 @isout bit=1 --1导出((默认),0导入
    14 AS
    15 declare @fname_in varchar(1000) --bcp处理应答文件名
    16 ,@fsize varchar(20) --要处理的文件的大小
    17 ,@m_tbname varchar(50) --临时表名
    18 ,@sql varchar(8000)
    19 
    20 --则取得导入文件的大小
    21 
    22 if @isout=1
    23 set @fsize='0'
    24 else
    25 begin
    26 create table #tb(可选名 varchar(20),大小 int
    27 ,创建日期 varchar(10),创建时间 varchar(20)
    28 ,上次写操作日期 varchar(10),上次写操作时间 varchar(20)
    29 ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)
    30 
    31 insert into #tb
    32 exec master..xp_getfiledetails @fname
    33 
    34 select @fsize=大小 from #tb
    35 drop table #tb
    36 
    37 if @fsize is null
    38 begin
    39 print '文件未找到'
    40 return
    41 end
    42 end
    

    View Code

     

     生成数据处理应答文件

    set @m_tbname='[##temp' cast(newid() as varchar(40)) ']'
    set @sql='select * into ' @m_tbname ' from(
    select null as 类型
    union all select 0 as 前缀
    union all select ' @fsize ' as 长度
    union all select null as 结束
    union all select null as 格式
    ) a'
    
    exec(@sql)
    
    select @fname_in=@fname '_temp'
    ,@sql='bcp "' @m_tbname '" out "' @fname_in
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'') '" /c'
    
    exec master..xp_cmdshell @sql
    

     

    删除临时表

    set @sql='drop table ' @m_tbname
    exec(@sql)
    
    if @isout=1
    begin
    set @sql='bcp "select top 1 ' @fdname ' from '
     @tbname case isnull(@tj,'') when '' then ''
    else ' where ' @tj end
     '" queryout "' @fname
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'')
     '" /i"' @fname_in '"'
    
    
    exec master..xp_cmdshell @sql
    end
    else
    begin
    

     

    为数据导入准备临时表

    set @sql='select top 0 ' @fdname ' into '
     @m_tbname ' from '  @tbname
    
    exec(@sql)
    

    将数据导入到临时表

    set @sql='bcp "' @m_tbname '" in "' @fname
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'')
     '" /i"' @fname_in '"'
    
    exec master..xp_cmdshell @sql
    

     

     将数据导入到正式表中

    set @sql='update ' @tbname
     ' set ' @fdname '=b.' @fdname
     ' from ' @tbname ' a,'
     @m_tbname ' b'
     case isnull(@tj,'') when '' then ''
    else ' where ' @tj end
    
    exec(@sql)
    

    删除数据处理临时表

    set @sql='drop table ' @m_tbname
    end
    

    删除数据处理应答文件

    set @sql='del ' @fname_in
    
    exec master..xp_cmdshell @sql
    go
    

     

     导入文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword'
    
    改为如下,不需引号
    
    EXEC master..xp_cmdshell 'bcp dbname..tablename in c:DT.txt -c -Sservername -Usa -Ppassword'
    

    导出文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword'
    
    此句需加引号
    

     

     

    1 insert into b(a, b, c) select d,e,f from b;
    

     

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

    4.11、Excel导到Txt

    想用

    select * into opendatasource(...) from opendatasource(...)

    实现将一个Excel文件内容导入到一个文本文件

     

    假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)

    且银行帐号导出到文本文件后分两部分,前8位和后8位分开。

     

    如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2

    然后就可以用下面的语句进行插入

    注意文件名和目录根据你的实际情况进行修改.

    新葡亰496net 66

    insert into
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Text;HDR=Yes;DATABASE=C:'
    )...[aa#txt]
    --,aa#txt)
    --*/
    
    select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    from
    opendatasource('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls'
    --,Sheet1$)
    )...[Sheet1$]
    

    新葡亰496net 67

     

     

    如果你想直接插入并生成文本文件,就要用bcp

    declare @sql varchar(8000),@tbname varchar(50) 
    

    首先将excel表内容导入到一个全局临时表

    新葡亰496net 68

    select @tbname='[##temp' cast(newid() as varchar(40)) ']'
    ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
    into ' @tbname ' from
    opendatasource(''MICROSOFT.JET.OLEDB.4.0''
    ,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls''
    )...[Sheet1$]'
    
    exec(@sql)
    

    新葡亰496net 69

    然后用bcp从全局临时表导出到文本文件

    set @sql='bcp "' @tbname '" out "c:aa.txt" /S"(local)" /P"" /c'
    exec master..xp_cmdshell @sql
    

    删除临时表

    exec('drop table ' @tbname) 
    
    1 insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    2 
    3 例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..
    

    4.12、用bcp将文件导入导出到数据库的存储过程:

    bcp-二进制文件的导入导出

    支持image,text,ntext字段的导入/导出

    image适合于二进制文件;text,ntext适合于文本数据文件

     

    注意:导入时,将覆盖满足条件的所有行

    导出时,将把所有满足条件的行也出到指定文件中

     

    此存储过程仅用bcp实现

     

    /*--调用示例

    --数据导出

    exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:zj1.dat' 
    

    --数据导出

    exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:zj1.dat','',0
    

     

    --*/

     

    新葡亰496net 70View Code

     

     生成数据处理应答文件

    新葡亰496net 71

    set @m_tbname='[##temp' cast(newid() as varchar(40)) ']'
    set @sql='select * into ' @m_tbname ' from(
    select null as 类型
    union all select 0 as 前缀
    union all select ' @fsize ' as 长度
    union all select null as 结束
    union all select null as 格式
    ) a'
    
    exec(@sql)
    
    select @fname_in=@fname '_temp'
    ,@sql='bcp "' @m_tbname '" out "' @fname_in
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'') '" /c'
    
    exec master..xp_cmdshell @sql
    

    新葡亰496net 72

     

    删除临时表

    新葡亰496net 73

    set @sql='drop table ' @m_tbname
    exec(@sql)
    
    if @isout=1
    begin
    set @sql='bcp "select top 1 ' @fdname ' from '
     @tbname case isnull(@tj,'') when '' then ''
    else ' where ' @tj end
     '" queryout "' @fname
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'')
     '" /i"' @fname_in '"'
    
    
    exec master..xp_cmdshell @sql
    end
    else
    begin
    

    新葡亰496net 74

     

    为数据导入准备临时表

    set @sql='select top 0 ' @fdname ' into '
     @m_tbname ' from '  @tbname
    
    exec(@sql)
    

    将数据导入到临时表

    新葡亰496net 75

    set @sql='bcp "' @m_tbname '" in "' @fname
     '" /S"' @servename
     case when isnull(@username,'')='' then ''
    else '" /U"' @username end
     '" /P"' isnull(@password,'')
     '" /i"' @fname_in '"'
    
    exec master..xp_cmdshell @sql
    

    新葡亰496net 76

     

     将数据导入到正式表中

    新葡亰496net 77

    set @sql='update ' @tbname
     ' set ' @fdname '=b.' @fdname
     ' from ' @tbname ' a,'
     @m_tbname ' b'
     case isnull(@tj,'') when '' then ''
    else ' where ' @tj end
    
    exec(@sql)
    

    新葡亰496net 78

    删除数据处理临时表

    set @sql='drop table ' @m_tbname
    end
    

    删除数据处理应答文件

    set @sql='del ' @fname_in
    
    exec master..xp_cmdshell @sql
    go
    

     

     导入文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword'
    
    改为如下,不需引号
    
    EXEC master..xp_cmdshell 'bcp dbname..tablename in c:DT.txt -c -Sservername -Usa -Ppassword'
    

    导出文本文件

    EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword'
    
    此句需加引号
    

    4、说明:子查询(表名1:a 表名2:b)

    1 select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
    

    5、说明:显示文章、提交人和最后回复时间

    1 select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
    

    6、说明:外连接查询(表名1:a 表名2:b)

    1 select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    

    7、说明:在线视图查询(表名1:a )

    1 select * from (SELECT a,b,c FROM a) T where t.a > 1;
    

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

    1 select * from table1 where time between time1 and time2
    2 
    3 select a,b,c, from table1 where a not between 数值1 and 数值2
    

    9、说明:in 的使用方法

    1 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
    

    10、说明:两张关联表,删除主表中已经在副表中没有的信息

    1 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
    

    11、说明:四表联查问题

    1 select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
    

    12、说明:日程安排提前五分钟提醒

    1 select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
    

    13、说明:一条sql 语句搞定数据库分页

    1 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    

    具体实现,关于数据库分页:

    1 declare @start int,@end int
    2 
    3   @sql nvarchar(600)
    4 
    5   set @sql=’select top’ str(@end-@start 1) ’ from T where rid not in(select top’ str(@str-1) ’Rid from T where Rid>-1)’
    6 
    7   exec sp_executesql @sql
    

    注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)

    14、说明:前10条记录

    1 select top 10 * form table1 where 范围
    

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

    1 select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
    

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表

    1 (select a from tableA ) except (select a from tableB) except (select a from tableC)
    

    17、说明:随机取出10条数据

    1 select top 10 * from tablename order by newid()
    

    18、说明:随机选择记录

    1 select newid()
    

    19、说明:删除重复记录

     1 1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
     2 
     3 2),select distinct * into temp from tablename
     4 
     5   delete from tablename
     6 
     7   insert into tablename select * from temp
     8 
     9 --评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
    10 
    11 3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
    12 
    13   alter table tablename
    14 
    15   --添加一个自增列
    16 
    17   add column_b int identity(1,1)
    18 
    19   delete from tablename where column_b not in(
    20 
    21   select max(column_b) from tablename group by column1,column2,...)
    22 
    23   alter table tablename drop column column_b
    

    20、说明:列出数据库里所有的表名

    1 select name from sysobjects where type='U' // U代表用户
    

    21、说明:列出表里的所有的列名

    1 select name from syscolumns where id=object_id('TableName')
    

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case

     1 select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
     2 
     3 --显示结果:
     4 
     5   type vender pcs
     6 
     7   电脑 A 1
     8 
     9   电脑 A 1
    10 
    11   光盘 B 2
    12 
    13   光盘 A 2
    14 
    15   手机 B 3
    16 
    17   手机 C 3
    

    23、说明:初始化表table1

    1 TRUNCATE TABLE table1
    

    24、说明:选择从10到15的记录

    1 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
    

    一、技巧

    1、1=1,1=2的使用,在SQL语句组合时用的较多 “where 1=1” 是表示选择全部 “where 1=2”全部不选,如:

     1 if @strWhere !=''
     2 
     3   begin
     4 
     5   set @strSQL = 'select count(*) as Total from ['   @tblName   '] where '   @strWhere
     6 
     7   end
     8 
     9   else
    10 
    11   begin
    12 
    13   set @strSQL = 'select count(*) as Total from ['   @tblName   ']'
    14 
    15   end
    

    我们可以直接写成,错误!未找到目录项。

    1 set @strSQL = 'select count(*) as Total from ['   @tblName   '] where 1=1 安定 '  @strWhere
    

    2、收缩数据库

     1 --重建索引
     2 
     3   DBCC REINDEX
     4 
     5   DBCC INDEXDEFRAG
     6 
     7   --收缩数据和日志
     8 
     9   DBCC SHRINKDB
    10 
    11   DBCC SHRINKFILE
    

    3、压缩数据库

    1 dbcc shrinkdatabase(dbname)
    

    4、转移数据库给新用户以已存在用户权限

    1 exec sp_change_users_login 'update_one','newname','oldname'
    

    5、检查备份集

    1 RESTORE VERIFYONLY from disk='E:dvbbs.bak'
    

    6、修复数据库

     1    ALTER DATABASE [dvbbs] SET SINGLE_USER
     2 
     3   GO
     4 
     5   DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
     6 
     7   GO
     8 
     9   ALTER DATABASE [dvbbs] SET MULTI_USER
    10 
    11   GO
    

    7、日志清除

     1    SET NOCOUNT ON
     2 
     3   DECLARE @LogicalFileName sysname,
     4 
     5   @MaxMinutes INT,
     6 
     7   @NewSize INT
     8 
     9   USE tablename -- 要操作的数据库名
    10 
    11   SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
    12 
    13   @MaxMinutes = 10, -- Limit on time allowed to wrap log.
    14 
    15   @NewSize = 1 -- 你想设定的日志文件的大小(M)
    16 
    17   Setup / initialize
    18 
    19   DECLARE @OriginalSize int
    20 
    21   SELECT @OriginalSize = size
    22 
    23   FROM sysfiles
    24 
    25   WHERE name = @LogicalFileName
    26 
    27   SELECT 'Original Size of '   db_name()   ' LOG is '  
    28 
    29   CONVERT(VARCHAR(30),@OriginalSize)   ' 8K pages or '  
    30 
    31   CONVERT(VARCHAR(30),(@OriginalSize*8/1024))   'MB'
    32 
    33   FROM sysfiles
    34 
    35   WHERE name = @LogicalFileName
    36 
    37   CREATE TABLE DummyTrans
    38 
    39   (DummyColumn char (8000) not null)
    40 
    41   DECLARE @Counter INT,
    42 
    43   @StartTime DATETIME,
    44 
    45   @TruncLog VARCHAR(255)
    46 
    47   SELECT @StartTime = GETDATE(),
    48 
    49   @TruncLog = 'BACKUP LOG '   db_name()   ' WITH TRUNCATE_ONLY'
    50 
    51   DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    52 
    53   EXEC (@TruncLog)
    54 
    55   -- Wrap the log if necessary.
    56 
    57   WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
    58 
    59   AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
    60 
    61   AND (@OriginalSize * 8 /1024) > @NewSize
    62 
    63   BEGIN -- Outer loop.
    64 
    65   SELECT @Counter = 0
    66 
    67   WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
    68 
    69   BEGIN -- update
    70 
    71   INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
    72 
    73   SELECT @Counter = @Counter   1
    74 
    75   END
    76 
    77   EXEC (@TruncLog)
    78 
    79   END
    80 
    81   SELECT 'Final Size of '   db_name()   ' LOG is '  
    82 
    83   CONVERT(VARCHAR(30),size)   ' 8K pages or '  
    84 
    85   CONVERT(VARCHAR(30),(size*8/1024))   'MB'
    86 
    87   FROM sysfiles
    88 
    89   WHERE name = @LogicalFileName
    90 
    91   DROP TABLE DummyTrans
    92 
    93   SET NOCOUNT OFF
    

    8、说明:更改某个表

    1 exec sp_changeobjectowner 'tablename','dbo'
    

    9、存储更改全部表

     1    CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
     2 
     3   @OldOwner as NVARCHAR(128),
     4 
     5   @NewOwner as NVARCHAR(128)
     6 
     7   AS
     8 
     9   DECLARE @Name as NVARCHAR(128)
    10 
    11   DECLARE @Owner as NVARCHAR(128)
    12 
    13   DECLARE @OwnerName as NVARCHAR(128)
    14 
    15   DECLARE curObject CURSOR FOR
    16 
    17   select 'Name' = name,
    18 
    19   'Owner' = user_name(uid)
    20 
    21   from sysobjects
    22 
    23   where user_name(uid)=@OldOwner
    24 
    25   order by name
    26 
    27   OPEN curObject
    28 
    29   FETCH NEXT FROM curObject INTO @Name, @Owner
    30 
    31   WHILE(@@FETCH_STATUS=0)
    32 
    33   BEGIN
    34 
    35   if @Owner=@OldOwner
    36 
    37   begin
    38 
    39   set @OwnerName = @OldOwner   '.'   rtrim(@Name)
    40 
    41   exec sp_changeobjectowner @OwnerName, @NewOwner
    42 
    43   end
    44 
    45   -- select @name,@NewOwner,@OldOwner
    46 
    47   FETCH NEXT FROM curObject INTO @Name, @Owner
    48 
    49   END
    50 
    51   close curObject
    52 
    53   deallocate curObject
    54 
    55   GO
    

    10、SQL SERVER中直接循环写入数据

     1 declare @i int
     2 
     3   set @i=1
     4 
     5   while @i<30
     6 
     7   begin
     8 
     9   insert into test (userid) values(@i)
    10 
    11   set @i=@i 1
    12 
    13   end
    

    案例:

      有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

     1 Name score
     2 
     3   Zhangshan 80
     4 
     5   Lishi 59
     6 
     7   Wangwu 50
     8 
     9   Songquan 69
    10 
    11   while((select min(score) from tb_table)<60)
    12 
    13   begin
    14 
    15   update tb_table set score =score*1.01
    16 
    17   where score<60
    18 
    19   if (select min(score) from tb_table)>60
    20 
    21   break
    22 
    23   else
    24 
    25   continue
    26 
    27   end
    

    四、数据开发-经典

    1.按姓氏笔画排序

    1 Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多
    

    2.数据库加密

    1    select encrypt('原始密码')
    2 
    3   select pwdencrypt('原始密码')
    4 
    5   select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
    6 
    7   select pwdencrypt('原始密码')
    8 
    9   select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 
    

    3.取回表中字段

    1 declare @list varchar(1000),
    2 
    3   @sql nvarchar(1000)
    4 
    5   select @list=@list ',' b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
    6 
    7   set @sql='select ' right(@list,len(@list)-1) ' from 表A'
    8 
    9   exec (@sql)
    

    4.查看硬盘分区

    1 EXEC master..xp_fixeddrives
    

    5.比较A,B表是否相等

     1    if (select checksum_agg(binary_checksum(*)) from A)
     2 
     3   =
     4 
     5   (select checksum_agg(binary_checksum(*)) from B)
     6 
     7   print '相等'
     8 
     9   else
    10 
    11   print '不相等'
    

    6.杀掉所有的事件探察器进程

    1    DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill ' RTRIM(spid) FROM master.dbo.sysprocesses
    2 
    3   WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
    4 
    5   EXEC sp_msforeach_worker '?'
    

    7.记录搜索

     1 --开头到N条记录
     2 
     3 Select Top N * From 表
     4 
     5 -------------------------------
     6 
     7 --N到M条记录(要有主索引ID)
     8 
     9 Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
    10 
    11 ----------------------------------
    12 
    13 --N到结尾记录
    14 
    15 Select Top N * From 表 Order by ID Desc
    

    案例

      例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录

    1 select top 10 recid from A where recid not in(select top 30 recid from A)
    

    分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

      select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

    解决方案

    1, 用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题

    2, 在那个子查询中也加条件:select top 30 recid from A where recid>-1

      例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。

    1 set @s = 'select top 1 * from T where pid not in (select top '   str(@count-1)   ' pid from T)'
    2 
    3 print @s exec sp_executesql @s
    

    9:获取当前数据库中的所有用户表

    1 select Name from sysobjects where xtype='u' and status>=0
    

    10:获取某一个表的所有字段

    1 select name from syscolumns where id=object_id('表名')
    2 
    3 select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')
    4 
    5 --两种方式的效果相同
    

    常用语法,sql语句语法。11:查看与某一个表相关的视图、存储过程、函数

    1 select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'
    

    12:查看当前数据库中所有存储过程

    1 select name as 存储过程名称 from sysobjects where xtype='P'
    

    13:查询用户创建的所有数据库

    1 select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
    2 
    3 --或者
    4 
    5 select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
    

    14:查询某一个表的字段和数据类型

    1 select column_name,data_type from information_schema.columns
    2 where table_name = '表名'
    

    15:不同服务器数据库之间的数据操作

     1    --创建链接服务器
     2 
     3   exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
     4 
     5   exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 '
     6 
     7   --查询示例
     8 
     9   select * from ITSV.数据库名.dbo.表名
    10 
    11   --导入示例
    12 
    13   select * into 表 from ITSV.数据库名.dbo.表名
    14 
    15   --以后不再使用时删除链接服务器
    16 
    17   exec sp_dropserver 'ITSV ', 'droplogins '
    18 
    19   --连接远程/局域网数据(openrowset/openquery/opendatasource)
    20 
    21   --1、openrowset
    22 
    23   --查询示例
    24 
    25   select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    26 
    27   --生成本地表
    28 
    29   select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    30 
    31   --把本地表导入远程表
    32 
    33   insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    34 
    35   select *from 本地表
    36 
    37   --更新本地表
    38 
    39   update b
    40 
    41   set b.列A=a.列A
    42 
    43   from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
    44 
    45   on a.column1=b.column1
    46 
    47   --openquery用法需要创建一个连接
    48 
    49   --首先创建一个连接创建链接服务器
    50 
    51   exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
    52 
    53   --查询
    54 
    55   select *
    56 
    57   FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
    58 
    59   --把本地表导入远程表
    60 
    61   insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
    62 
    63   select * from 本地表
    64 
    65   --更新本地表
    66 
    67   update b
    68 
    69   set b.列B=a.列B
    70 
    71   FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
    72 
    73   inner join 本地表 b on a.列A=b.列A
    74 
    75   --3、opendatasource/openrowset
    76 
    77   SELECT *
    78 
    79   FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
    

     

    本文由新葡亰496net发布于网络数据库,转载请注明出处:常用语法,sql语句语法

    关键词:

上一篇:没有了

下一篇:没有了