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 触发器

 

 

 

你可能感兴趣的:(sql)