• SQL备忘


    修改基础表后,刷新关联视图的两种方法:http://www.cnblogs.com/Sabre/archive/2012/04/23/2467144.html

    更新ntext字段的方法:http://www.cnblogs.com/miaomiaoga/archive/2006/07/31/463858.html

    断开指定用户对某个数据库的连接:

    1.在指定的数据库中使用sp_who存储过程获得正在连接此数据库的用户

    例如 sp_who sa

    2.使用KILL 终止 SPID

    例如 kill 10

    分组编号(参考):

    ---2000
    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-04-06 20:38:41
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    --    Nov 24 2008 13:01:59 
    --    Copyright (c) 1988-2005 Microsoft Corporation
    --    Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([YM] int,[Name] varchar(1),[OrderNo] varchar(6))
    insert [tb]
    select 200901,'a','014123' union all
    select 200901,'b','014723' union all
    select 200901,'c','015145' union all
    select 200902,'a','015146' union all
    select 200902,'b','015178' union all
    select 200902,'c','015100' union all
    select 200903,'a','014174' union all
    select 200901,'a','015197' union all
    select 200903,'a','016127' union all
    select 200901,'b','014567' union all
    select 200901,'a','016200'
    --------------开始查询--------------------------
    select
     *,item=(select count(1)+1 from tb where ym=t.ym and name=t.name and OrderNo<t.OrderNo) 
    from
     [tb] t
    order by
      ym,name
    ----------------结果----------------------------
    /* YM          Name OrderNo item
    ----------- ---- ------- --------------------
    200901      a    014123  1
    200901      a    015197  2
    200901      a    016200  3
    200901      b    014567  1
    200901      b    014723  2
    200901      c    015145  1
    200902      a    015146  1
    200902      b    015178  1
    200902      c    015100  1
    200903      a    014174  1
    200903      a    016127  2
    
    (11 行受影响)
    
    */
    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-04-06 20:38:41
    -- Version:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    --    Nov 24 2008 13:01:59 
    --    Copyright (c) 1988-2005 Microsoft Corporation
    --    Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([YM] int,[Name] varchar(1),[OrderNo] varchar(6))
    insert [tb]
    select 200901,'a','014123' union all
    select 200901,'b','014723' union all
    select 200901,'c','015145' union all
    select 200902,'a','015146' union all
    select 200902,'b','015178' union all
    select 200902,'c','015100' union all
    select 200903,'a','014174' union all
    select 200901,'a','015197' union all
    select 200903,'a','016127' union all
    select 200901,'b','014567' union all
    select 200901,'a','016200'
    --------------开始查询--------------------------
    select *,item=row_number()over(partition by ym,name order by OrderNo) from [tb] 
    ----------------结果----------------------------
    /* YM          Name OrderNo item
    ----------- ---- ------- --------------------
    200901      a    014123  1
    200901      a    015197  2
    200901      a    016200  3
    200901      b    014567  1
    200901      b    014723  2
    200901      c    015145  1
    200902      a    015146  1
    200902      b    015178  1
    200902      c    015100  1
    200903      a    014174  1
    200903      a    016127  2
    
    (11 行受影响)
    
    */

     分组取最大/最新值(借用上面分组编号的测试数据 参考):

    select YM,[Name],OrderNo from 
    (
    select *,item=(select count(1)+1 from tb where YM=t.YM and Name=t.Name and OrderNo>t.OrderNo) 
    from [tb] t
    ) t
    where item=1
    order by YM,[Name] 
    
    
    select a.*
    from [tb] a
    where not exists
    (
        select 1
        from [tb]
        where YM=a.YM and [Name]= a.[Name]  
        and  OrderNo> a.OrderNo
    )
    order by YM,[Name] 
    
    select a.*
    from [tb] a
    where  exists
    (
        select count(1)
        from [tb]
        where YM=a.YM and [Name]= a.[Name]  
        and  OrderNo> a.OrderNo
        having count(1)<1
    )
    order by YM,[Name] 
    
    
    select a.*
    from [tb] a
    inner join 
    (
        select YM,[Name],max(OrderNo) as OrderNo
        from [tb]
        group by YM,[Name]
    ) b on  a.YM=b.YM and a.[Name]=b.[Name] and a.OrderNo=b.OrderNo
    order by YM,[Name] 
    
    
    select a.*
    from [tb] a
    where OrderNo =
    (
        select top 1 OrderNo
        from [tb]
        where YM=a.YM and [Name]= a.[Name]  
        order by OrderNo desc
    )
    order by YM,[Name] 

    在SQL Server中区分大小写的几种方法参考

    从数据库Collate到存储过程到函数,各种方法都有,选择适合你的。

    第一种:

    ALTER TABLE tb
    ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS
    --不区分大小写
    ALTER TABLE tb
    ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS
    --区分大小写
    alter database 数据库 COLLATE Chinese_PRC_CS_AS 

    第二种:--创建如下用户自定义函数(UDF)

    CREATE FUNCTION StrComp(@Str1 VARCHAR(50),@Str2 VARCHAR(50))
    --ALTER FUNCTION StrComp(@Str1 VARCHAR(50),@Str2 VARCHAR(50))
    RETURNS INTEGER
    AS
    BEGIN
    DECLARE @i INTEGER
    --DECLARE @Str1 VARCHAR(50)
    --DECLARE @Str2 VARCHAR(50)
    DECLARE @y INT
    --SET @Str1='a'
    --SET @Str2='A'
    SET @i=0
    --SELECT ASCII(SUBSTRING(@Str1,@i+1,1))
    SET @y=1
    DECLARE @iLen INT
    SET @iLen = LEN(LTRIM(RTRIM(@Str1)))
    IF LEN(LTRIM(RTRIM(@Str1))) < LEN(LTRIM(RTRIM(@Str2))) --THEN
    SET @iLen = LEN(LTRIM(RTRIM(@Str2)))
    WHILE (@i < @iLen)
    BEGIN
    IF (ASCII(SUBSTRING(@Str1,@i+1,1))=ASCII(SUBSTRING(@Str2,@i+1,1))) --THEN
    SET @i = @i +1
    ELSE
    BEGIN
    SET @y=0
    BREAK
    END
    END
    RETURN @y
    END

    测试: 

    select *
    from Table1
    Where dbo.StrComp(Field1,'aAbB') =1

    第三种:

      SQL Server 数据库中的文本信息可以用大写字母、小写字母或二者的组合进行存储。例如,姓氏可"SMITH"、"Smith"或"smith"等形式出现。

      数据库是否区分大小写取决于 SQL Server 的安装方式。如果数据库区分大小写,当搜索文本数据时,必须用正确的大小写字母组合构造搜索条件。例如,如果搜索名字"Smith",则不能使用搜索条件"=smith"或"=SMITH"。

      另外,如果服务器被安装成区分大小写,则必须用正确的大小写字母组合提供数据库、所有者、表和列的名称。如果提供的名称大小写不匹配,则 SQL Server 返回错误,报告"无效的对象名"。

      当使用关系图窗格和网格窗格创建查询时,查询设计器始终正确地反映出服务器是否区分大小写。但是,如果在 SQL 窗格中输入查询,则必须注意使名称与服务器解释名称的方式相匹配。

      如果服务器是用不区分大小写的选项安装的,则提示若要确定服务器是否区分大小写,请执行存储过程 sp_server_info,然后检查第18 行的内容。如果服务器是用不区分大小写的设置安装的,则 sort_order 选项将设置为"不区分大小写"。可以从查询分析器运行存储过程。

    第四种:

    select * from servers where convert(varbinary, name)=convert(varbinary, N'RoCKEY')

    第五种:

      如ascii('a')再配合Substring()一起用。

    SQL Server中生成随机密码 (参考1参考2)

    -- 生成纯数字密码
    SELECT LEFT(abs(checksum(newid()))+'0000000000',10)
    
    -- 生成数字字母混合密码
    SELECT LEFT(LOWER(NEWID()),8)
    
    --From URL http://www.sqlservercentral.com/articles/SQL+Puzzles/2878/
    
    CREATE PROCEDURE dbo.uspCreatePassword(    
      @UpperCaseItems SMALLINT--指定含有的大写个数
      ,    @LowerCaseItems SMALLINT--指定含有的小写个数
      ,    @NumberItems SMALLINT--指定含有的数字个数
      ,    @SpecialItems SMALLINT)--指定含有的特殊字符个数
     AS  
     SET NOCOUNT ON 
     DECLARE @UpperCase VARCHAR(26)
            , @LowerCase VARCHAR(26)
              , @Numbers VARCHAR(10)
              , @Special VARCHAR(13)
              , @Temp VARCHAR(8000)
              , @Password VARCHAR(8000)
              , @i SMALLINT
              , @c VARCHAR(1)
              , @v TINYINT 
    -- Set the default items in each group of characters
    SELECT @UpperCase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        ,    @LowerCase = 'abcdefghijklmnopqrstuvwxyz'
         ,    @Numbers = '0123456789'
         ,    @Special = '!@#$%&*()_+-='
         ,    @Temp = ''
         ,    @Password = '' 
    -- Enforce some limits on the length of the password
    IF @UpperCaseItems > 20
      SET @UpperCaseItems = 20 
    IF @LowerCaseItems > 20
      SET @LowerCaseItems = 20 
    IF @NumberItems > 20    
      SET @NumberItems = 20 
    IF @SpecialItems > 20    
      SET @SpecialItems = 20 
    
    -- Get the Upper Case Items
    SET @i = ABS(@UpperCaseItems) 
    WHILE @i > 0 AND LEN(@UpperCase) > 0
      SELECT @v = ABS(CAST(CAST(NEWID() AS BINARY(16)) AS BIGINT)) % LEN(@UpperCase) + 1
      ,    @c = SUBSTRING(@UpperCase, @v, 1)
      ,    @UpperCase = CASE 
           WHEN @UpperCaseItems < 0 
                THEN STUFF(@UpperCase, @v, 1, '') 
             ELSE @UpperCase 
      END
      ,    @Temp = @Temp + @c
      ,    @i = @i - 1 
    -- Get the Lower Case Items
    SET @i = ABS(@LowerCaseItems) 
    WHILE @i > 0 AND LEN(@LowerCase) > 0    
      SELECT @v = ABS(CAST(CAST(NEWID() AS BINARY(16)) AS BIGINT)) % LEN(@LowerCase) + 1
      ,    @c = SUBSTRING(@LowerCase, @v, 1)
      ,    @LowerCase = CASE 
           WHEN @LowerCaseItems < 0 
               THEN STUFF(@LowerCase, @v, 1, '') 
             ELSE @LowerCase 
      END
      ,    @Temp = @Temp + @c
      ,    @i = @i - 1 
    
    -- Get the Number Items
    SET @i = ABS(@NumberItems) 
    WHILE @i > 0 AND LEN(@Numbers) > 0    
      SELECT @v = ABS(CAST(CAST(NEWID() AS BINARY(16)) AS BIGINT)) % LEN(@Numbers) + 1
      ,    @c = SUBSTRING(@Numbers, @v, 1)
      ,    @Numbers = CASE 
           WHEN @NumberItems < 0 
               THEN STUFF(@Numbers, @v, 1, '') 
             ELSE @Numbers 
      END
      ,    @Temp = @Temp + @c
      ,    @i = @i - 1 
      
    -- Get the Special Items
    SET @i = ABS(@SpecialItems) 
    WHILE @i > 0 AND LEN(@Special) > 0    
      SELECT @v = ABS(CAST(CAST(NEWID() AS BINARY(16)) AS BIGINT)) % LEN(@Special) + 1
      ,    @c = SUBSTRING(@Special, @v, 1)
      ,    @Special = CASE 
           WHEN @SpecialItems < 0 
               THEN STUFF(@Special, @v, 1, '') 
            ELSE @Special 
      END
      ,    @Temp = @Temp + @c
      ,    @i = @i - 1 
      
    -- Scramble the order of the selected items
    WHILE LEN(@Temp) > 0    
      SELECT @v = ABS(CAST(CAST(NEWID() AS BINARY(16)) AS BIGINT)) % LEN(@Temp) + 1
      ,    @Password = @Password + SUBSTRING(@Temp, @v, 1)
      ,    @Temp = STUFF(@Temp, @v, 1, '') 
    
    SELECT @Password
    
    
    
    /*
    
    --
    exec uspCreatePassword 2,2,2,2
    
    ----------
    MT&4g(5j
    
    
    exec uspCreatePassword 2,2,4,0
    
    ------------
    38Io84Vw
    
    */
    /**
    use master
    
    SELECT name, dbo.fn_RandomPassword(8,8) as UserPassword
        FROM sysusers
    
    dbo.fn_RandomPassword(最小长度,最大长度)
    **/
    
    
    --- Start vwRand --- 
    SET quoted_identifier  ON 
    
    GO 
    
    SET ansi_nulls  ON 
    
    GO 
    
    IF EXISTS (SELECT * 
               FROM   sys.sysobjects 
               WHERE  id = Object_id(N'[dbo].[vwRand]') and OBJECTPROPERTY(id, N'IsView') = 1) 
      DROP VIEW [dbo].[vwrand] 
    
    GO 
    
    --created by Rick Toner on 03/16/2007 
    --updated by Rick Toner on 03/16/2007 
    CREATE VIEW dbo.vwrand 
    AS 
      SELECT Rand() AS R 
    
    GO 
    
    SET quoted_identifier  off 
    
    GO 
    
    SET ansi_nulls  ON 
    
    GO 
    --Uncomment the below line if you need to implement security 
    --GRANT SELECT ON [vwRand] TO [UserAccountOrDataseRole] 
    
    --- End vwRand --- 
    
    
    --- Start fn_Rand --- 
    SET quoted_identifier  ON 
    
    GO 
    
    SET ansi_nulls  ON 
    
    GO 
    
    IF EXISTS (SELECT * 
               FROM   dbo.sysobjects 
               WHERE  id = Object_id(N'[dbo].[fn_Rand]') 
                      AND xtype IN (N'FN',N'IF',N'TF')) 
      DROP FUNCTION [dbo].[fn_rand] 
    
    GO 
    
    --created by Rick Toner on 03/16/2007 
    --updated by Rick Toner on 03/16/2007 
    CREATE FUNCTION fn_rand( ) 
    RETURNS FLOAT 
    AS 
      BEGIN 
        RETURN (SELECT r 
         FROM   vwrand) 
      END 
    
    GO 
    
    SET quoted_identifier  off 
    
    GO 
    
    SET ansi_nulls  ON 
    
    GO 
    --Uncomment the below line if you need to implement security 
    --GRANT EXECUTE ON [fn_Rand] TO [UserAccountOrDataseRole] 
    
    --- End fn_Rand --- 
    
    
    --- Start fn_RandomPassword --- 
    SET quoted_identifier  ON 
    
    GO 
    
    SET ansi_nulls  ON 
    
    GO 
    
    IF EXISTS (SELECT * 
               FROM   dbo.sysobjects 
               WHERE  id = Object_id(N'[dbo].[fn_RandomPassword]') 
                      AND xtype IN (N'FN',N'IF',N'TF')) 
      DROP FUNCTION [dbo].[fn_randompassword] 
    
    GO 
    
    --created by Rick Toner on 03/16/2007 
    --updated by Rick Toner on 03/16/2007 
    CREATE FUNCTION fn_randompassword 
                   (@MinLength SMALLINT  = 5, 
                    @MaxLength SMALLINT  = 8) 
    RETURNS VARCHAR(100) 
    AS 
      BEGIN 
        DECLARE  @Password VARCHAR(30) 
        DECLARE  @Length SMALLINT 
        DECLARE  @Position SMALLINT 
        DECLARE  @Characters VARCHAR(55) 
        DECLARE  @LetterPosition INT 
        DECLARE  @Letter CHAR(1) 
        SET @Characters = 'aeubcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ23456789' 
        SET @Password = '' 
        -- determine length 
        SET @Length = @MinLength 
                        + Round(dbo.Fn_rand() 
                                  * (@MaxLength 
                                       - @MinLength),0,0) 
        SET @Position = 1 
        WHILE @Position <= @Length 
          BEGIN 
            BEGIN 
              BEGIN 
                SET @LetterPosition = CONVERT(INT,Round((dbo.Fn_rand() 
                                                           * (Len(@Characters) 
                                                                - 1)),0,0),1) 
                                        + 1 
                SET @Letter = Substring(@Characters,@LetterPosition,1) 
                SET @Password = @Password 
                                  + @Letter 
              END 
            END 
            SET @Position = @Position 
                              + 1 -- incriment counter 
          END 
        -- return password 
        RETURN @password 
      END 
    
    GO 
    
    SET quoted_identifier  off 
    
    GO 
    
    SET ansi_nulls  ON 
    
    GO 
    --Uncomment the below line if you need to implement security 
    --GRANT EXECUTE ON [fn_RandomPassword] TO [UserAccountOrDataseRole] 
    
    --- End fn_RandomPassword --- 

    INSTEAD OF INSERT 触发器

  • 相关阅读:
    Git学习-创建版本库
    使用Vim编辑器,如何退出
    设置既定目录的命令提示符
    字符数组和字符串
    一波杂乱的分享
    全国软件设计大赛C/C++语言练习
    HDU 1720、1062、2104、1064、2734、1170、1197、2629
    hdu 2000-2010 ACM
    HDU——算法练习1000 1089-1096
    爬虫学习笔记之为什么要设置超时时间,怎么设置(使用selenium)
  • 原文地址:https://www.cnblogs.com/xuezhizhang/p/2904641.html
Copyright © 2020-2023  润新知