zoukankan      html  css  js  c++  java
  • 开发中常用的sql语句

    1.导入Excel进数据库,以及导出Excel

    本人使用的是 sqlserver2008R2,sqlserver 2005以上版本应该都支持

    --先调用sp_configure配置
    
    -----打开
    exec sp_configure 'show advanced options',1
    reconfigure
    exec sp_configure 'Ad Hoc Distributed Queries',1
    reconfigure
    go
    --关闭
    exec sp_configure 'Ad Hoc Distributed Queries',0
    reconfigure
    exec sp_configure 'show advanced options',0
    reconfigure 
    go
    --调用sp_configure配置
    EXEC sp_configure 'show advanced options', 1
    GO
    
    --调用sp_configure配置
    EXEC sp_configure 'show advanced options', 1
    GO
    --更新配置信息
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
    exec sp_configure 'Ole Automation Procedures',0
    reconfigure

    --系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

    --------------------下面是正式代码,经过测试----------------------------------------------------------

    导出Excel

    exec master..xp_cmdshell 'bcp " select * from SongDB..AppTB" queryout d:\af.xls -c -U "sa" -P "sa"'


    --如果接受数据导入的表已经存在

    insert intoselect * from 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

    --如果导入数据并生成表

    select * intofrom 
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
    ,'Excel 5.0;HDR=YES;DATABASE=c:\test.xls',sheet1$)

    注意:导入 Excel版本的问题

    --导入 97-2003格式 *.xls

    insert into QQFindGreen select * from 
    
    OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=2;DATABASE=D:\qqfindgreen.xls',[Sheet1$])

    --导入2007以上格式 *.xlsx

    insert into TableDownload select * from 
    OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;HDR=YES;DATABASE=D:\QQ上剩下的表单.xlsx',sheet1$)

    --注明: HDR=YES 这个会把Excel的 第一行当做表头子来使用,如果你想导入纯数据,请将 HDR=YES改为HDR=NO

    --2、在SQL SERVER里往Excel插入数据:
    -- ======================================================

    --T-SQL代码:

    INSERT INTO OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Sheet1$] 
    (bestand, produkt) VALUES (20, 'Test')

    导出Excel

    exec master..xp_cmdshell 'bcp " select top(10) Sid,SongName,Singer from SongDB..SongTB" queryout d:\ah.xls -c -U "sa" -P "sa"'
    
     

    --Excel里面数据的更新

    update OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=d:\songModel.xls;','select * from [download$]')
    set NoName1='2000' where 批次 not in(select top(10) 批次 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;IMEX=2;DATABASE=d:\songModel.xls',[download$]))
    
     

    --------------------------------------------------------------------------------------------------------------------------------------------
    --结论:sql 对于Excel 不支持删除操作
    delete from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=d:\songModel.xls',download$) where 批次='2'
    /*
    链接服务器"(null)"的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 返回了消息 "该 ISAM 不支持在链接表中删除数据。"。
    消息 7345,级别 16,状态 1,第 1 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "MICROSOFT.JET.OLEDB.4.0" 无法从表 "download$" 删除数据。出现可恢复的、特定于提供程序的错误,如 RPC 失败。

    另外特别说明一点:sql语句可以更新Excel表里面的内容,但是 不能删除里面的东西,这个是因为要考虑Excel的安全性

    如果要操作删除Excel里面的行,例如删除表头子,可以使用C#代码来删除

    纯sql语句完成不了这一功能,要是你们有sql语句可以直接删除Excel表结构的,请指教我,谢谢.

    /*分割线********************************************************************************************************/

    3.使用 Link Server

       使用linq server,你可以访问别的数据库,比如说,你又两个以上的数据库,但是你程序(C#里面的 配置文件connectionString)配置的字符串,肯定不会随意改变

    两个数据库,就有连个字符串,也不方便随意切换来,切换去,甚至在 sqlserver里面查数据的时候,如果两个表的数据是有关联的

    这时候,使用linq server,让你省去了不少麻烦

    --开启 Link Server

    exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','127.0.0.1'
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','sa'
    go


    --关闭link server

    exec sp_dropserver 'srv_lnk','droplogins'
    go
    select distinct A.Sid,A.SongName,A.Singer from AllOORest A,srv_lnk.SongDB.dbo.AlbumSong B

    4.得到表的所有信息

    --得到表的列的所有信息

    select
    c.name as [字段名],t.name as [字段类型]
    ,convert(bit,c.IsNullable) as [可否为空]
    ,convert(bit,case when exists(select 1 from sysobjects where xtype='PK' and parent_obj=c.id and name in (
    select name from sysindexes where indid in(
    select indid from sysindexkeys where id = c.id and colid=c.colid))) then 1 else 0 end) 
    as [是否主键]
    ,convert(bit,COLUMNPROPERTY(c.id,c.name,'IsIdentity')) as [自动增长]
    ,c.Length as [占用字节] 
    ,COLUMNPROPERTY(c.id,c.name,'PRECISION') as [长度]
    ,isnull(COLUMNPROPERTY(c.id,c.name,'Scale'),0) as [小数位数]
    ,ISNULL(CM.text,'') as [默认值]
    ,isnull(ETP.value,'') AS [字段描述]
    --,ROW_NUMBER() OVER (ORDER BY C.name) AS [Row]
    from syscolumns c
    inner join systypes t on c.xusertype = t.xusertype 
    left join sys.extended_properties ETP on ETP.major_id = c.id and ETP.minor_id = c.colid and ETP.name ='MS_Description' 
    left join syscomments CM on c.cdefault=CM.id
    where c.id = object_id('DownloadTB')

    5.有时候,使用 % _,通配符进行查找数据的时候,可能不是很方便

    我们想使用 C#里面的 contains()函数这样的功能

    解决方法是建立全文本索引,我从网上找来的方法,原处已经忘记了,感谢那位网友的热情分享

    use SongDB --打开数据库
    go
    --检查pubs是否支持全文索引,如果不支持全文索引,则使用sp_fulltext_datebase打开该功能
    if (select databaseproperty ('SongDB','IsFulltextEnables'))=0
    execute sp_fulltext_database 'enable'
    --建立全文目录FT_pubs
    execute sp_fulltext_catalog 'FT_pubs','create'
    --为titles表建立全文索引数据元
    execute sp_fulltext_table 'app','FT_pubs','PK_app'
    --设置全文索引列名
    execute sp_fulltext_column 'app','sid','add'
    --建立全文索引
    execute sp_fulltext_table 'FT_pubs','activate'
    --填充全文索引目录
    execute sp_fulltext_catalog 'FT_pubs','start_full'
    GO

    ------------------------------------------------------------------------------------

    GO
    --检查全文目录填充情况
    WHILE FulltextCatalogProperty('FT_pubs','PopulateStatus')<>0
    BEGIN
    --如果全文目录正处于填充状态,则等待30秒后再检测一次
    WAITFOR DELAY '0:0:30'
    END


    --------------------------------------------------------------------------------------

    6.我想还有一些功能,是很多人想用的,比如导入xml数据

    从本质上来讲 xml数据是比Excel数据要友好一点,因为 xml数据,你可以使用

    linq to xml,以及 使用文件读写xml的方式来访问,但是为了不用那么麻烦

    自己去解析 xml,然后拼接sql语句来进行insert into,本人一度曾经这么做过

    因为在网上没发现什么 能够直接拿来用的.

    我的数据都是从百万级数据库上 导出的xml数据,都是几十兆大小到几百兆大小不等

    如果直接 放在sql语句里面当做xml变量,我试过,打开文件不是一般的长...

    最好的办法是,只要知道它的结构,以及xml文件所存放在磁盘上的物理路径就好了

    实现的方法如下

    首先要自己创建一个表名

    CREATE TABLE tb_OldTB(
    歌曲名称 nvarchar(200),
    表演者 nvarchar(200),
    歌曲类别 nvarchar(50),
    歌手类别 nvarchar(50),
    音源存放路径 nvarchar(120)
    )
    
    go
    
     

    然后是 导入xml文件

    DECLARE @h int,
    @doc xml
    SELECT @doc=BulkColumn FROM OPENROWSET (BULK 'I:\NewExcel\514273.xml', SINGLE_BLOB) AS xmlData 
    EXECUTE sp_xml_preparedocument @h OUTPUT, @doc
    insert into tb_OldTB select * from OPENXML(@h, '/data/row',2) WITH tb_OldTB 
    EXECUTE sp_xml_removedocument @h
    go

    --需要修改的地方有两处 ,

    其一是 BULK 'd:\NewExcel\514273.xml' 这里放的是 xml文件在电脑上的物理路径

    其二是 :'/data/row'  这是xml里面的结构,比如根节点是 data, 下面的子节点 是 row,row里面放置的就是一条一条的记录

    --导入完毕以后会显示 导入的结果

    --查询前10条

    select top(10)* from tb_OldTB

    本人感觉挺傻的,就是导入xml不像导入 Excel那样会给你自动创建表,而要你自己亲自动手创建表,尽管有些牛人 也用sql自己写函数实现了这一功能

    本人后来想想,创建一张表,要多少时间,而且 字段的定义,长短多少都可以做到心中有数,表结构是相当重要的!!!这一点请一定要牢记

     另外是 说一下 虽然导入Excel,可以让它自动帮我们建好字段,可是系统也是相当的傻,字段的类型 居然都是 varchar,而且长度都是 255 !!!

    对于 自增列Id,的处理不方便,要自己动手改,对于 长于255的备注信息,文章信息 都会被截断!!! 这实在.... 所以为了...最好还是自己建好表结构

    然后再往表里面插入数据

    尽量少使用 insert into 新表 select * from ....

    恩,有其他的导入的,可以 发来跟我一起分享一下,

    比如 导入的数据是 .txt的文本文件 等等

  • 相关阅读:
    计算机图形学之光栅图形学——反走样算法简介
    计算机图形学之光栅图形学——区域填充算法简介
    计算机图形学之光栅图形学——多边形的扫描转换算法简介
    计算机图形学——光栅图形学直线算法简介
    Kendall tau距离(即两个内容相同的数组中逆序数对的数量)(算法》P220 第2.5.3.2小节)
    自顶向下归并排序的应用——链表的随机化
    双调数组中的二分查找
    根据离散概率随机返回数组中的项
    字符串解析
    找出只出现一次的整数
  • 原文地址:https://www.cnblogs.com/mjxxsc/p/3043905.html
Copyright © 2011-2022 走看看