zoukankan      html  css  js  c++  java
  • SQL-操作示例

    1.查询视图、存储过程中包含的字段

    select distinct object_name( id) id,text from syscomments where id in
    (
     select object_id from sys. objects where type  in ( 'P','V' ,'FN') and text like '%View_FinanceInfo_ForReport%'
    )

    2.查看被锁表

    SELECT request_session_id spid,OBJECT_NAME (resource_associated_entity_id) tableName
    FROM sys .dm_tran_locks
    WHERE resource_type ='OBJECT' AND OBJECT_NAME(resource_associated_entity_id )='TCC_Peptj_ProjectInfo'
    --解锁:
    DECLARE @spid int Set @spid = 107
    --锁表进程
    DECLARE @sql varchar( 1000)
    SET @sql ='kill '+ cast(@spid as varchar)
    EXEC(@sql )
    
    --sqlserver 捕获异常
    DECLARE @sql VARCHAR( 5000)
    SELECT  @sql = 'SELECT  COUNT(*) FROM peptj.PowerOn.dbo.view_tcc_intf_1'
    BEGIN TRY
        EXEC(@sql )
    END TRY
    BEGIN CATCH
        IF ERROR_MESSAGE () <> ''
            BEGIN
                INSERT  INTO TCC_MonitoringLogsInfo
                        SELECT  ' 链接服务 ' ,
                                GETDATE() ,
                                ERROR_NUMBER() AS error_number ,
                                ERROR_MESSAGE() AS error_message ,
                                ERROR_STATE() AS error_state ,
                                ERROR_SEVERITY() AS error_severity
            END
    END CATCH
    
    USE [master]
    GO
    DECLARE     @return_value int
    EXEC  @return_value = [dbo].[sp_who_lock]
    SELECT      'Return Value' = @return_value
    GO
    
    
    USE [master]
    GO
    DECLARE     @return_value int
    EXEC  @return_value = [dbo].[p_lockinfo]
                @kill_lock_spid = 72
    SELECT      'Return Value' = @return_value
    GO

    3.SqlServer2008 无法修改表,超时时间已到 在操作完成之前超时解决方法

    在SQL Server Management Studio里,通过菜单“工具-选项”打开选项对话框。在左侧寻找“设计器-表设计器和数据库设计器",
    然后在右侧勾选“为表设计器更新重写连接字符串的超时值”,在它下面的“事务超时时间”默认应该是30秒,我们应该把它改的稍微大一些

    4.SqlServer存储过程中使用事务,示例

    Create proc pro_GetProTrans
            @GoodsId int,
            @Number int,
            @StockPrice money,
            @SupplierId int,
            @EmpId int,
            @StockUnit varchar(50),
            @StockDate datetime,
            @TotalMoney money ,
            @ActMoney money ,
            @baseId int,
            @Description nvarchar(255)
        As
              declare @error int =0 --事务中操作的错误记录
              --开启事务
              begin transaction
                    --实现进货信息的添加
                    insert into StockInfo values(@GoodsId, @Number, @StockPrice, @SupplierId, @EmpId, @StockUnit, @StockDate, @TotalMoney, @ActMoney,DEFAULT,@Description, @baseId)
                    set @error+=@@ERROR --记录有可能产生的错误号
                    --获取当前进货信息的标识列
                    --判断当前商品有没有进货记录
                    if exists (select * from dbo.InventoryInfo where goodid=@GoodsId) --说明记录存在,直接修改库存数量
                    begin
                        update dbo.InventoryInfo set GNumber=GNumber+@Number,TotalMoney+=@TotalMoney where goodid=@GoodsId
                        set @error+=@@ERROR --记录有可能产生的错误号     
                    end
                    else --这个商品从来没有过进货记录,那么就应该添加新的存在信息
                    begin
                        declare @GWarningNum int --此商品的预警数量
                        --获取预警数量
                        set @GWarningNum=(select WaringNum from dbo.GoodsInfo where GId=@GoodsId)
                        insert into   dbo.InventoryInfo values(@GoodsId,@Number,@baseId,@GWarningNum,@TotalMoney,'第一次进货',default)
                        set @error+=@@ERROR --记录有可能产生的错误号     
                    end
                --判断事务的提交或者回滚
                if(@error<>0)
                begin
                        rollback transaction
                        return -1 --设置操作结果错误标识
                end
                else
                begin
                        commit transaction
                        return 1 --操作成功的标识
                 end
    go

    5.sql 读错误日志

    方法一:
        可以通过执行该命令来查看错误日志信息:exec xp_readerrorlog
        方法二:
        在SQL SERVER Management Studio中连接该sql server实例,
      object Explorer中查找Management
    ->SQL Server logs->右键选view-
        选择你要看的日志信息(sql server log or sql server and Windows log) 方法三: 去安装路径下去找你的log文件,我的默认实例路径如下 driver:SQL Server 2008 R2MSSQL10_50.MSSQLSERVERMSSQLLogERRORLOG DBCC SHOWCONTIG('表名') SELECT a.name AS 表名,MAX(b.rows) AS 记录条数 FROM sysobjects a,sysindexes b WHERE a.id=b.id AND a.xtype='u' GROUP BY a.name ORDER BY MAX(b.rows) DESC

    6.创建服务器链接

      if exists(select srvname from master.dbo.sysservers where srvname = 'Tcc106Server')
        begin
                 EXEC sp_droplinkedsrvlogin 'Tcc106Server', NULL
                 EXEC sp_dropserver 'Tcc106Server'
        end
        GO
    
        EXEC sp_addlinkedserver 'Tcc106Server', '', 'SQLOLEDB', NULL, NULL, 'DRIVER={SQL Server};SERVER=10.2.1.6;UID=sa;PWD=sql密码;'
        EXEC sp_serveroption 'Tcc106Server', 'rpc out', 'true'
        EXEC sp_addlinkedsrvlogin 'Tcc106Server', 'false', NULL, 'sa', 'sql密码'
        GO

    7. 查看列注册

    SELECT t.[name] AS [表名],c.[name] AS [字段名],cast(ep.[value] as varchar(100)) AS [字段说明]
        FROM sys.tables AS t 
        INNER JOIN sys.columns AS c ON t.object_id = c.object_id 
        LEFT JOIN sys.extended_properties AS ep ON ep.major_id = c.object_id AND ep.minor_id = c.column_id 
        WHERE ep.class =1 and t.[name]='TCC_PayMentProcess' 
    
        扩展:SELECT  * FROM SYSCOLUMNS WHERE ID= OBJECT_ID('TCC_BusinessTrip' )

    8.查看约束

    Select * From sysobjects a 
       Left join syscomments b on a.id = b.id 
       Where a.parent_obj= object_id('表名') 

    9.sql server特殊查询

    一、包含中文字符     
            select * from 表名 where 列名 like '%[吖-座]%'
      二、包含英文字符
            select * from 表名 where 列名 like '%[a-z]%' 
      三、包含纯数字
            select * from 表名 where 列名 like '%[0-9]%'

    10.sql 多条数据各自的最大日期

    select * from cards a
        where not exists (select 1 from cards where acardnum=a.acardnum and srcvouchdate>a.srcvouchdate)

    11.Sql Server REPLACE函数的使用

    REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。
        语法:REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )
        参数:''string_replace1'':待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。
                  ''string_replace2'':待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。
                  ''string_replace3'':替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。
        返回类型:如果 string_replace(123)是支持的字符数据类型之一,则返回字符数据。如果 string_replace(123)是支持的 binary 数据类型之一,则返回二进制数据。
        示例:下例用 xxx 替换 abcdefghi 中的字符串 cde。
                  SELECT REPLACE(''abcdefghicde'',''cde'',''xxx'')GO
                   结果:abxxxfghixxx

    12.SQL 函数

    Abs(number) 取得数值的绝对值。
        Asc(String) 取得字符串表达式的第一个字符ASCII 码。
        Atn(number) 取得一个角度的反正切值。
        CallByName (object, procname, usecalltype,[args()]) 执行一个对象的方法、设定或传回对象的属性。
        CBool(expression) 转换表达式为Boolean 型态。
        CByte(expression) 转换表达式为Byte 型态。
        CChar(expression) 转换表达式为字符型态。
        CDate(expression) 转换表达式为Date 型态。
        CDbl(expression) 转换表达式为Double 型态。
        CDec(expression) 转换表达式为Decimal 型态。
        CInt(expression) 转换表达式为Integer 型态。
        CLng(expression) 转换表达式为Long 型态。
        CObj(expression) 转换表达式为Object 型态。
        CShort(expression) 转换表达式为Short 型态。
        CSng(expression) 转换表达式为Single 型态。
        CStr(expression) 转换表达式为String 型态。
        Choose (index, choice-1[, choice-2, ... [, choice-n]]) 以索引值来选择并传回所设定的参数。
        Chr(charcode) 以ASCII 码来取得字符内容。
        Close(filenumberlist) 结束使用Open 开启的档案。
        Cos(number) 取得一个角度的余弦值。
        Ctype(expression, typename) 转换表达式的型态。
        DateAdd(dateinterval, number, datetime) 对日期或时间作加减。
        DateDiff(dateinterval, date1, date2) 计算两个日期或时间间的差值。
        DatePart (dateinterval, date) 依接收的日期或时间参数传回年、月、日或时间。
        DateSerial(year, month, day) 将接收的参数合并为一个只有日期的Date 型态的数据。
        DateValue(datetime) 取得符合国别设定样式的日期值,并包含时间。
        Day(datetime) 依接收的日期参数传回日。
        Eof(filenumber) 当抵达一个被开启的档案结尾时会传回True。
        Exp(number) 依接收的参数传回e 的次方值。
        FileDateTime(pathname) 传回档案建立时的日期、时间。
        FileLen(pathname) 传回档案的长度,单位是Byte。
        Filter(sourcearray, match[, include[, compare]]) 搜寻字符串数组中的指定字符串,凡是数组元素中含有指定字符串,会将它们结合成新的字符串数组并传回。若是要传回不含指定字符串的数组元素,则include 参数   设为False。compare 参数则是设定搜寻时是否区分大小写,此时只要给TextCompare 常数或1 即可。
        Fix(number) 去掉参数的小数部分并传回。
        Format(expression[, style[, firstdayofweek[, firstweekofyear]]]) 将日期、时间和数值资料转为每个国家都可以接受的格式。
        FormatCurrency(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 将数值输出为金额型态。
        numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
        FormatDateTime(date[,namedformat]) 传回格式化的日期或时间数据。
        FormatNumber(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回格式化
    的数值数据。Numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
        FormatPercent(expression[,numdigitsafterdecimal [,includeleadingdigit]]) 传回转换为百分比格式的数值数据。numdigitsafterdecimal 参数为小数字数,includeleadingdigit 参数为当整数为0 时是否补至整数字数。
        GetAttr(filename) 传回档案或目录的属性值。
        Hex(number) 将数值参数转换为16 进制值。
        Hour(time) 传回时间的小时字段,型态是Integer。
        Iif(expression, truepart, falsepart) 当表达式的传回值为True 时执行truepart 字段的程序,反之则执行falsepart 字段。
        InStr([start, ]string1, string2) 搜寻string2 参数设定的字符出现在字符串的第几个字符,start 为由第几个字符开始寻找,string1 为欲搜寻的字符串,string2 为欲搜寻的字符。
        Int(number) 传回小于或等于接收参数的最大整数值。
        IsArray(varname) 判断一个变量是否为数组型态,若为数组则传回True,反之则为False。
        IsDate(expression) 判断表达式内容是否为DateTime 型态,若是则传回True,反之则为False。
        IsDbNull(expression) 判断表达式内容是否为Null,若是则传回True,反之则为False。
        IsNumeric(expression) 判断表达式内容是否为数值型态,若是则传回True,反之则为False。
        join(sourcearray[, delimiter]) 将字符串数组合并唯一个字符串,delimiter 参数是设定在各个元素间加入新的字符串。
        Lcase(string) 将字符串转换为小写字体。
        Left(string, length) 由字符串左边开始取得length 参数设定长度的字符。
        Len(string) 取得字符串的长度。
        Log(number) 取得数值的自然对数。
        Ltrim(string) 去掉字符串的左边空白部分。
        Mid(string, start[, length]) 取出字符串中strat 参数设定的字符后length 长度的字符串,若length 参数没有设定,则取回start 以后全部的字符。
        Minute(time) 取得时间内容的分部分,型态为Integer。
        MkDir(path) 建立一个新的目录。
        Month(date) 取得日期的月部分,型态为Integer。
        MonthName(month) 依接收的月份数值取得该月份的完整写法。
        Now() 取得目前的日期和时间。
        Oct(number) 将数值参数转换为8 进制值。
        Replace(expression, find, replace) 将字符串中find 参数指定的字符串转换为replace 参数指定的字符串。
        Right(string,length) 由字符串右边开始取得length 参数设定长度的字符。
        RmDir(path) 移除一个空的目录。
        Rnd() 取得介于0 到1 之间的小数,如果每次都要取得不同的值,使用前需加上Randomize 叙述。
        Rtrim(string) 去掉字符串的右边空白部分。
        Second(time) 取得时间内容的秒部分,型态为Integer。
        Sign(number) 取得数值内容是正数或负数,正数传回1,负数传回-10 传回0。
        Sin(number) 取得一个角度的正弦值。
        Space(number) 取得number 参数设定的空白字符串。
        Split(expression[, delimiter]) 以delimiter 参数设定的条件字符串来将字符串分割为字符串数组。
        Sqrt(number) 取得一数值得平方根。
        Str(number) 将数字转为字符串后传回。
        StrReverse(expression) 取得字符串内容反转后的结果。
        Tan(number) 取得某个角度的正切值。
        TimeOfDay() 取得目前不包含日期的时间。
        Timer() 取得由0:00 到目前时间的秒数,型态为Double。
        TimeSerial(hour, minute, second) 将接收的参数合并为一个只有时间Date 型态的数据。
        TimaValue(time) 取得符合国别设定样式的时间值。
        Today() 取得今天不包含时间的日期。
        Trim(string) 去掉字符串开头和结尾的空白。
        TypeName(varname) 取得变量或对象的型态。
        Ubound(arrayname[, dimension]) 取得数组的最终索引值,dimension 参数是指定取得第几维度的最终索引值。
        Ucase(string) 将字符串转换为大写。
        Val(string) 将代表数字的字符串转换为数值型态,若字符串中含有非数字的内容则会将其去除后,合并为一数字。
        Weekday(date) 取的参数中的日期是一个星期的第几天,星期天为1、星期一为2、星期二为3 依此类推。
        WeekDayName(number) 依接收的参数取得星期的名称,可接收的参数为1 到7,星期天为1、星期一为2、星期二为3 依此类推。

    13.游标的使用

    DECLARE <游标名> SCROLL CURSOR
    FOR
    SELECT Name FROM dbo.Staff
    OPEN <游标名>
    DECLARE @NAME VARCHAR(20)
    FETCH  last FROM <游标名> INTO @NAME
    IF @@FETCH_STATUS=0 --游标是否查询成功0成功
    PRINT @NAME
    ELSE
    PRINT '提取数据错误'
    CLOSE <游标名>
    DEALLOCATE <游标名>

    14.触发器

    DML触发器
    Insert触发器
    CREATE TRIGGER T_addMoney ON dbo.Staff FOR INSERT
    AS
    UPDATE dbo.Staff SET Money=Money+1 WHERE ID=(SELECT ID FROM Inserted) --插入一条数据后自动将money+1
    Delete触发器
    CREATE TRIGGER T_Delete ON dbo.Staff FOR DELETE
    AS
    SELECT * FROM Deleted --删除后显示删除的内容
    Update触发器
    CREATE TRIGGER T_Update ON dbo.Staff FOR UPDATE
    AS
    IF (UPDATE(Name) OR UPDATE(Sex)) BEGIN
    PRINT '基础数据不能更改'
    ROLLBACK TRANSACTION
    END
    ELSE
    PRINT '数据修改成功'
    DDL触发器
    CREATE TRIGGER T_notdelete ON DATABASE
    FOR DROP_TABLE,ALTER_TABLE AS
    PRINT '事物不能被处理,基础数据表不能被修改和删除'
    ROLLBACK

    15.SQL Server查询所有的表名、字段名、注释

    SELECT
    表名=case   when   a.colorder=1   then   d.name   else   ''   end,
    表说明=case   when   a.colorder=1   then   isnull(f.value,'')   else   ''   end,
    字段序号=a.colorder,
    字段名=a.name,
    标识=case   when   COLUMNPROPERTY(   a.id,a.name,'IsIdentity')=1   then   ''else   ''   end,
    主键=case   when   exists(SELECT   1   FROM   sysobjects   where   xtype='PK'   and   name   in   (
    SELECT   name   FROM   sysindexes   WHERE   indid   in(
    SELECT   indid   FROM   sysindexkeys   WHERE   id   =   a.id   AND   colid=a.colid
    )))   then   ''   else   ''   end,
    类型=b.name,
    占用字节数=a.length,
    长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
    小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
    允许空=case   when   a.isnullable=1   then   ''else   ''   end,
    默认值=isnull(e.text,''),
    字段说明=isnull(g.[value],'')
    FROM   syscolumns   a
    left   join   systypes   b   on   a.xusertype=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   sys.extended_properties   g   on   a.id=g.major_id   and   a.colid=g.minor_id
    left   join   sys.extended_properties   f   on   d.id=f.major_id   and   f.minor_id=0
    --where   d.name='orders'         --如果只查询指定表,加上此条件
    order   by   a.id,a.colorder

    16.修改sql数据库名称

    USE master; 
    GO
    DECLARE @SQL VARCHAR(MAX); 
    SET @SQL=''
    SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) FROM master..sysprocesses WHERE dbid=DB_ID('旧数据库'); EXEC(@SQL);
    GO --重命名
    exec sp_renamedb @dbname='旧数据库', @newname='新数据库'; --改为多用户模式
    ALTER DATABASE 新数据库 SET MULTI_USER;

    17.SQL修改表字段,加附属属性

    GO
    ALTER TABLE [dbo].[t_Enroll] ADD IsNeedForm INT NULL DEFAULT 0
    Go
    EXEC sys.[sp_addextendedproperty] @name = 'MS_Description',@value = '是否填写表单',@level0type = 'SCHEMA',@level0name = 'dbo',@level1type = 'TABLE',@level1name = 't_Enroll',@level2type = 'COLUMN',@level2name = 'IsNeedForm'

    18.查询非系统数据库

    Select name FROM Master.. SysDatabases where dbid>4

    19.选择water数据库下的所有表

    use [water] SELECT name FROM sysobjects WHERE xtype = 'U' Or xtype = 'S'

    20.选择water数据库下的所有用户表

     use [water] SELECT name FROM sysobjects WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0

    21.查询water数据库下的admin表的字段名,长度,类型,字段说明

     USE [water] 
     SELECT a.[name] as '字段名',a.length '长度',c.[name] '类型',e.value as '字段说明' 
     FROM syscolumns  a 
     left   join    systypes    b   on      a.xusertype=b.xusertype 
     left     join     systypes     c     on      a.xtype = c.xusertype 
     inner   join   sysobjects  d   on      a.id=d.id     and   d.xtype='U' 
     left join sys.extended_properties e on a.id = e.major_id and a.colid = e.minor_id and e.name='MS_Description'
     where d.name='admin'
    
    其中sys.extended_properties系统内置视图用于存储字段说明,
    且只有在MSSQL2005以上才有这张表的,且前面的sys.不能去掉,SQL2000的话字段说明是存在另一个张表里的,表名忘记了,反正我不需要也懒得去查了...
    特此记录!!!

    PS:以上为本人日常工作常用的sql语句,后期还会补充更新

  • 相关阅读:
    04.DRF-开发REST 接口
    03.DRF-设计方法
    02.DRF-认识RESTful
    01.DRF-Web应用模式
    14.Django-xadmin和富文本编辑器
    13.Django-分页
    12.Django-admin
    11.Django-form表单上传文件
    android 基于wifi模块通信开发
    android蓝牙通讯开发(详细)
  • 原文地址:https://www.cnblogs.com/hyshareex/p/14282075.html
Copyright © 2011-2022 走看看