sql集合

 

SQL 修改表列名

在sql server中修改表的列名,可以使用sp_rename

sp_rename 'table.oldcolumn','newcolumn','column'

table是表名,oldcolumn 是原来的列名,newcolumn是新的列名

注意:newcolumn 前面不要有表名,否则,更改后的列名为table.newcolumn

 

查询一张表中根据某一字段重复的纪录

例如 表 tbl_person_Card 中有一字段 cardNumber ,此字段是不应该重复的,但是数据分析 cardNumber 有重复的纪录,如何查询出重复的纪录的 id 是多少呢? 如下:

select id, cardNumber from tbl_person_Card where id not in
(
   select max(id) as id from tbl_person_Card group by cardNumber
)

这样就查询出了重复的纪录的 id 和 cardNumber

select * from tbl_person_Card where cardNumber = '6392910000000144' 即可将重复纪录查询出来分析原因。


SQL Server:定时作业 job 的设置方法

如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现。

  1、管理->SQL Server代理->作业(按鼠标右键)->新建作业->

  2、新建作业属性(常规)->名称[自定义本次作业的名称]->启用的方框内是勾号->

  分类处可选择也可用默认的[未分类(本地)]->所有者默认为登录SQL Server用户[也可选其它的登录]->

  描述[填写本次工作详细描述内容];

  [ 创建作业分类的步骤:

    SQL Server代理->作业->右键选所有任务->添加、修改、删除 ]

  3、新建作业属性(步骤)->新建->步骤名[自定义第一步骤名称]->类型[Transact-SQL(TSQL)脚本]->

     数据库[要操作的数据库]->命令
  
     [ 如果是简单的SQL直接写进去即可,也可用打开按钮输入一个已写好的*.sql文件
       如果要执行存储过程,填
       exec p_procedure_name v_parameter1,[ v_parameter2…v_parameterN]
      ]
     
   ->确定
   (如果有多个步骤,可以再次调用下面的新建按钮;也可以对已有的多个步骤插入、编辑、删除);

  4、建作业属性(调度)->新建调度->名称[自定义调度名称]->启用的方框内是勾号->调度->反复出现->

   更改[调度时间表]->确定
  
   (如果只要保存此作业,不要定时做可以把启用的方框内是勾号去掉);

  5、建作业属性(通知)->用默认的通知方法就好[当作业失败时,写入Windows应用程序系统日志] ->确定。

  跟作业执行相关的一些SQL Server知识:

  SQLSERVERAGENT服务必须正常运行,启动它的NT登录用户要跟启动SQL Server数据库的NT登录用户一致。

  点作业右键可以查看作业执行的历史记录情况,也可以立即启动作业和停止作业。


  最近在看作业历史记录时,发现有的作业记录的历史记录多,有的作业记录的记录的历史记录少.

  如何能使某些作业按各自的需求,保留一段时间.比如保留一个月的历史记录.

  看了SQL Server的在线帮助文档,里面介绍说:

  在管理->SQL Server代理->右键选属性->作业系统->限制作业历史记录日志的大小->

  作业历史记录日志的最大大小(行数)    默认为1000    如果某台机器的作业数量很多,一定要提高它,例如为100000

  每个作业历史记录日志的最大行数      默认为100     如果作业每天执行两次,需要保留一个月的日志,可以设为60

  它们之间有一个相互制约关系, 我们可以根据自己的需要来改.

  如果SQL Server服务器改过机器名, 管理是旧名称时建立的job的时候可能会遇到

  错误14274: 无法添加、更新或删除从MSX服务器上发起的作业(或其步骤或调度)

  看了Microsoft的文档:http://support.microsoft.com/default.aspx?scid=kb;en-us;281642

  说SQL Server 2000系统里msdb..sysjobs 里originating_server 字段里存的是原来的服务器的名称.

  24X7在用的系统肯定不能按上面Microsoft的文档说的那样把名字改回来又改过去。

  于是想,msdb..sysjobs 能否update originating_server 字段成现在在用的新服务器名?

use msdb

select * from sysjobs

  找到originating_server 字段还是旧服务器的job_id, 然后执行update语句:

update sysjobs set originating_server='new_server_name'
where job_id='B23BBEBE-A3C1-4874-A4AB-0E2B7CD01E14'

  (所影响的行数为 1 行)

  这样就可以添加、更新或删除那些曾经出error 14274 的作业了。


  如果想把作业由一台机器迁移到另一台机器,可以先保留好创建作业的脚本, 然后在另一台机器上运行。

  导出所有作业的创建脚本操作步骤:

    管理->SQL Server代理->作业(鼠标右键)->所有任务->生成SQL脚本->保存到操作系统下的某个sql文件

  导出某一个作业的创建脚本操作步骤:
 
    管理->SQL Server代理->作业->选中待转移的作业(鼠标右键)->所有任务->生成SQL脚本->保存到OS下的某个sql文件

  然后在目的服务器上运行刚才保存下来的创建作业的sql脚本。

  ( 如果建作业的用户或者提醒的用户不存在, 则会出错;

    我们需要在目的服务器上建立相关的WINDOWS用户或者SQL Server数据库登录,

    也可以修改创建作业的脚本, 把目的服务器上不存在的用户替换成已经有的用户。
 
    如果生成日志的物理文件目录不存在,也应该做相关的修改,例如d:\区转f:\区等
 
    字符串的 @command 命令里有分隔符号 go 也会出错, 可以把它去掉)

 

SQl 语句(常见) 新建,删除,修改表结构

create table [表名]
(
[自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,
[字段1] nVarChar(50) default '默认值' null ,
[字段2] ntext null ,
[字段3] datetime,
[字段4] money null ,
[字段5] int default 0,
[字段6] Decimal (12,4) default 0,
[字段7] image null ,
)

删除表:
Drop table [表名]

插入数据:
INSERT INTO [表名] (字段1,字段2) VALUES (100,'51WINDOWS.NET')

删除数据:
DELETE FROM [表名] WHERE [字段名]>100

更新数据:
UPDATE [表名] SET [字段1] = 200,[字段2] = '51WINDOWS.NET' WHERE [字段三] = 'HAIWA'

新增字段:
ALTER TABLE [表名] ADD [字段名] NVARCHAR (50) NULL

删除字段:
ALTER TABLE [表名] DROP COLUMN [字段名]

修改字段:
ALTER TABLE [表名] ALTER COLUMN [字段名] NVARCHAR (50) NULL

重命名表:(Access 重命名表,请参考文章:在Access数据库中重命名表)
sp_rename '表名', '新表名', 'OBJECT'

新建约束:
ALTER TABLE [表名] ADD CONSTRAINT 约束名 CHECK ([约束字段] <= '2000-1-1')

删除约束:
ALTER TABLE [表名] DROP CONSTRAINT 约束名

新建默认值
ALTER TABLE [表名] ADD CONSTRAINT 默认值名 DEFAULT '51WINDOWS.NET' FOR [字段名]

删除默认值
ALTER TABLE [表名] DROP CONSTRAINT 默认值名

另外以上的只是SQL的语法在 ACCESS 下大部份也都是一样的

项 一项查阅,并经自己使用验证,确认在access 数据库中添加自动编号字段使用以下方法比较合适: create table 数据表名称 (id counter constraint primarykey primary key) 需要注意的地方是:第二个primary中间有空格,另外,关键字不区分大小写. 另外自己最近发现的一种方法是: sql="create table mytb (id autoincrement(25,1) primary key,age int)" sql2="create table testtb (id autoincrement,age int,email char, primary key (id))" 其中在access中,autoincrement为自动编号类型字段,(25,1)分别为初始值及步长值,如果不写的话,默认是1,1,primary key指定了主键,以上示例,两种指定方法都可以

SQLserver中用convert函数转换日期格式

select getdate()
结果:2003-12-28 16:52:00.107

select convert(char(8),getdate(),112)
结果:20031228

select convert(char(8),getdate(),108)
结果:16:52:00

select convert(char(8),getdate(),112)
                                  |
                            指日期格式

规则如下:

1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113  欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120  ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121  ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM

 

 select   *   from   MY_TABLE   where   CONVERT(char(10),Copy_time,120)   =   '2004-01-07' 

 

 

C#.net连接数据库

static void processTransactions()
  {

   OleDbConnection cn = new OleDbConnection(connectionString);
   cn.Open();
   OleDbTransaction Trans = cn.BeginTransaction();
   OleDbCommand cmd = cn.CreateCommand();
   cmd.Connection = cn;
   cmd.Transaction = Trans;

   cmd.CommandText = "eFund_InsertD";
   cmd.CommandType = CommandType.StoredProcedure;

   try
   {

      OleDbParameter p1=cmd.Parameters.Add("@HEADER_NO",OleDbType.Integer);
      OleDbParameter p2=cmd.Parameters.Add("@ST02",OleDbType.VarChar,4);
      p1.Value  = xxx;
      p2.Value  = xxx;

      cmd.ExecuteNonQuery();

    }

   catch(Exception ex)
   {
    Trans.Rollback();
    cn.Close();
    file.Close();
   }
   finally
   {
    Trans.Commit(); 
    cn.Close();
   }



posted @ 2009-06-23 15:52  DaGuang  阅读(391)  评论(0编辑  收藏  举报