exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
如下:
表A
ID NAME
1 A1
2 A2
3 A3
表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
表A和表B是1对多的关系 A.ID => B.AID
SELECT ID,NAME from A WHERE EXIST (SELECT * from B WHERE A.ID=B.AID)
执行结果为
1 A1
2 A2
原因可以按照如下分析
SELECT ID,NAME from A WHERE EXISTS (SELECT * from B WHERE B.AID=1)
--->SELECT * from B WHERE B.AID=1有值返回真所以有数据
SELECT ID,NAME from A WHERE EXISTS (SELECT * from B WHERE B.AID=2)
--->SELECT * from B WHERE B.AID=2有值返回真所以有数据
SELECT ID,NAME from A WHERE EXISTS (SELECT * from B WHERE B.AID=3)
--->SELECT * from B WHERE B.AID=3无值返回真所以没有数据
NOT EXISTS 就是反过来
SELECT ID,NAME from A WHERE NOT EXIST (SELECT * from B WHERE A.ID=B.AID)
执行结果为
3 A3
===================================================================== ......
问题:
您工作的本机装有Visual Studio 2005,局域网中有一台SQL Server 2005数据库服务器,你想通过本机远程调试SQL Server 2005服务器上的存储过程。但是不知道如何配置或启用远程调试?希望这篇文章对您有用。对于数据库和Visual Studio在同一机器的存储过程调试,园子里已经有一篇译作说的很好了,可以去参考:在Visual Studio 2005中调试SQL Server 2005的存储过程,但是对于远程调试的配置,没有过多篇幅描述,所以本文就说说如何配置SQL Server 2005进行远程调试。
开始之前,我们先约定,运行Visiual Studio 2005(下边简称VS)的机器,称之为客户机,运行SQL Server 2005(后边若未特殊说明,SQL Server均指SQL Server 2005)的机器,称之为服务器。
在下边的演示中,我的客户机操作系统是Windows XP SP2,服务器是Windows Server 2003 ,安装有SQL Server 2005,两台机器是对等网络关系,都不是通过域登录/管理的。事实上,在域中的二台机器,配置起用会更方便。所在请先检查您的网络环境,并抓住配置方法的核心要点,不要搞不定了跑来扔砖我哦:D~
废话少说,进入主题,在远 ......
需求:有excel文件,含多个sheet,每个sheet的内容对应插入到一张表,sheet的名称就是对应的表名称。
每一行为列名,例如:
达成:将每个sheet输出成一个以sheet名称命名的sql文件,内容为每行内容的insert语句。
以上图为例会生成三个sql文件,分别是TF_R_TERMINAL_ARCH.sql, TF_R_STOCK_TRADE.sql 和 TF_R_STOCK_TRADE_DETAIL.sql 如下图
下面是程序ExcelToInsert.java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import jxl.Sheet;
import jxl.Workbook;
public class ExcelToInsert {
public static void main(String[] args) {
String table_name = ""; // 表名
String sqlCell = ""; // 表单元格
String SQL = ""; // 完整的一条SQL插入语句
final String EXL_NAME = "20100419"; // Excel文件名
final String BASE_PATH = "F:/temp/"; // 文件路径
final String IN_EXL_PATH = BASE_PATH + EXL_NAME + ".xls"; // excelPath
FileWriter fw = null;
int rows = 0;
int columns = 0;
try {
try {
Workbook rwb = Workbook.getWorkbook(new File(IN_EXL_PATH));
......
-- Sql Get Last Day of Month...
SELECT (CASE MONTH(GETDATE())
WHEN 1 THEN 31
WHEN 2 THEN (CASE YEAR(GETDATE())%4 WHEN 0 THEN 29 ELSE 28 END)
WHEN 3 THEN 31
WHEN 4 THEN 30
WHEN 5 THEN 31
WHEN 6 THEN 30
WHEN 7 THEN 31
......
适用:ORACLE
修改列名
alter table xxx rename column aaa to bbb;
删除一列
alter table xxx drop column aaa;
增加一列
alter table xxx add aaa varchar2(22);
修改某列的类型
alter table xxx modify aaa varchar2(22);
把某一列的值赋给另一列
update xxx set aaa = bbb;
修改某一列允许为空(不为空)
alter table xxx modify aaa (not) null;
修改某一列的默认值
alter table xxx modify aaa default 1;
为某一列增加注释
comment on column xxx.aaa is 'abc......';
设置某一列为主键
& ......
SQL Server 2008 复制 分区SWITCH清理数据
场景:
某种特定业务下,我们的部分业务数据可能只会保留比较短的时间,用来做临时处理。因为考虑高可用的特性,可能会利用
SQL Server的复制组件复制这种数据到另外的 类似前端,查询中心等数据库服务器,创建一个冗余副本。复制组件标记事务日志,追踪所有的Update,Insert,Delete操作。可是如果不定期清理这种表,那么在一个快速增长的环境下,表变的臃肿不堪,不仅仅浪费磁盘空间,而且给性能带来了负面影响。
如:
A临时数据中心 ---同步-->B 查询/其他业务中心,副本
保证A不可用的时候,B的业务不依赖于A服务器,利用A同步过来的数据B自己直接处理。
常见的解决方案:
一、很简单的,我们可以想到,建立一个清理Job
,根据日期标识,确定删除的范围不出一点错误,比如我每天的晚上12:00以后清理昨天的数据,那么可能会构建这样的查询(朋友们,也许会说使用TRUNCATE
,准时的12:00来TRUNCATE掉,不过很不幸的是,SQL
Server 复制是利用日志标记的方式来同步数据,而TRUNCATE语句不会被日志 ......