T-SQL 片段收藏

 

存储过程

 1 CREATE PROCEDURE spInsertOrUpdateProduct

 2 --有则更新,否则插入

 3     @ProductName NVARCHAR(50) ,

 4     @ProductNumber NVARCHAR(25) ,

 5     @StdCost MONEY

 6 AS

 7     IF EXISTS ( SELECT  *

 8                 FROM    Production.Product

 9                 WHERE   ProductNumber = @ProductNumber )

10         UPDATE  Production.Product

11         SET     Name = @ProductName ,

12                 StandardCost = @StdCost

13         WHERE   ProductNumber = @ProductNumber

14     ELSE

15         INSERT  INTO Production.Product

16                 ( Name ,

17                   ProductNumber ,

18                   StandardCost

19                 )

20                 SELECT  @ProductName ,

21                         @ProductNumber ,

22                         @StdCost

23                     

24 GO
View Code

 触发器

 1 CREATE TRIGGER tr_DelProduct ON Production.Product

 2     FOR DELETE

 3 AS

 4     IF ( SELECT COUNT(*)

 5          FROM   sales.SalesOrderDetail

 6                 INNER JOIN DELETED ON salesorderdetail.ProductID = DELETED.productid

 7        ) > 0

 8         BEGIN

 9             RAISERROR ('Cannot delete a product with sales orders',14,1)

10             ROLLBACK TRANSACTION

11             RETURN

12         END
View Code

 自定义函数

 1 CREATE FUNCTION dbo.fn_LastOfMonth ( @TheDate DATETIME )

 2 RETURNS DATETIME

 3 AS

 4     BEGIN

 5         DECLARE @FirstOfMonth DATETIME

 6         DECLARE @DaysInMonth INT

 7         DECLARE @RetDate DATETIME

 8         SET @FirstOfMonth = DATEADD(mm, DATEDIFF(mm, 0, @TheDate), 0)

 9         SET @DaysInMonth = DATEDIFF(d, @FirstOfMonth,

10                                     DATEADD(m, 1, @FirstOfMonth))

11         RETURN DATEADD(d,@DaysInMonth-1,@FirstOfMonth)

12     END
View Code

 查看表的元数据,也就是数据的数据

1 SELECT  *

2 FROM    sys.columns

3 WHERE   [object_id] = OBJECT_ID('Production.Product')

不建议用上面的系统试图
可以用数据库视图

1 IF NOT EXISTS ( SELECT  *

2                 FROM    INFORMATION_SCHEMA.TABLES

3                 WHERE   TABLE_NAME = 'Address'

4                         AND TABLE_NAME = 'Person' )

5     DROP TABLE PERSON.Address

6 GO
View Code

 修改对象

 1 ALTER PROCEDURE spInsertOrUpdateProduct

 2     @ProductName NVARCHAR(50) ,

 3     @ProductNumber NVARCHAR(25) ,

 4     @StdCost MONEY ,

 5     @ListPrice MONEY

 6 AS

 7     BEGIN TRY

 8         BEGIN TRANSACTION

 9         IF EXISTS ( SELECT  *

10                     FROM    Production.Product

11                     WHERE   ProductNumber = @ProductName )

12             UPDATE  Production.Product

13             SET     Name = @ProductName ,

14                     StandardCost = @StdCost

15             WHERE   ProductNumber = @ProductNumber

16         ELSE

17             INSERT  INTO production.Product

18                     ( Name ,

19                       ProductNumber ,

20                       StandardCost ,

21                       ListPrice

22                     )

23                     SELECT  @ProductName ,

24                             @ProductNumber ,

25                             @StdCost ,

26                             @ListPrice

27         COMMIT TRANSACTION

28     END TRY

29     BEGIN CATCH

30         DECLARE @ErrMsg VARCHAR(1000)

31         SET @ErrMsg = ERROR_MESSAGE()

32         ROLLBACK TRANSACTION

33         RAISERROR(@ErrMsg,14,1)

34         RETURN

35     END CATCH
View Code

 添加和删除表列

1 ALTER TABLE Production.Product

2 ADD LeadTime SMALLINT NULL

3 

4 ALTER TABLE production.Product

5 DROP COLUMN LeadTime
View Code

 WITH TIES用法,找出最贵的一个商品,但最贵的有好多个

1 SELECT TOP(1) WITH TIES * FROM Production.Product

2 ORDER BY ListPrice DESC 

3 --返回5条记录
View Code

 交叉表查询

 1 CREATE TABLE [Test]

 2     (

 3       [id] [int] IDENTITY(1, 1)

 4                  NOT NULL ,

 5       [name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS

 6                             NULL ,

 7       [subject] [nvarchar](50) COLLATE Chinese_PRC_CI_AS

 8                                NULL ,

 9       [Source] [numeric](18, 0) NULL

10     )

11 ON  [PRIMARY]

12 GO

13 INSERT  INTO [test]

14         ( [name], [subject], [Source] )

15 VALUES  ( N'张三', N'语文', 60 ) ,

16         ( N'李四', N'数学', 70 ),

17         ( N'王五', N'英语', 80 ),

18         ( N'王五', N'数学', 75 ),

19         ( N'王五', N'语文', 57 ),

20         ( N'李四', N'语文', 80 ),

21         ( N'张三', N'英语', 100 );

22 Go 

23 

24 SELECT  *

25 FROM    test

26 

27 -------方法一----------

28 SELECT  name ,

29         SUM(CASE subject

30               WHEN '数学' THEN source

31               ELSE 0

32             END) AS '数学' ,

33         SUM(CASE subject

34               WHEN '英语' THEN source

35               ELSE 0

36             END) AS '英语' ,

37         SUM(CASE subject

38               WHEN '语文' THEN source

39               ELSE 0

40             END) AS '语文'

41 FROM    test

42 GROUP BY name

43 ------方法二--------

44 DECLARE @sql VARCHAR(8000)

45 SET @sql = 'select name,'

46 SELECT  @sql = @sql + 'sum(case subject when ''' + subject + ''' 

47 then source else 0 end) as ''' + subject + ''','

48 FROM    ( SELECT DISTINCT

49                     subject

50           FROM      test

51         ) AS a

52 SELECT  @sql = LEFT(@sql, LEN(@sql) - 1) + ' from test group by name'

53 EXEC(@sql)

54 go
View Code

 游标

 1 USE Northwind

 2 GO

 3 

 4 DECLARE curProduct CURSOR

 5 FOR

 6     SELECT  ProductID ,

 7             ProductName

 8     FROM    dbo.Products

 9 

10 DECLARE @ProdID INT

11 DECLARE @ProdName NVARCHAR(100)

12 

13 OPEN curProduct

14 FETCH NEXT FROM curProduct INTO @ProdID, @ProdName

15 WHILE @@FETCH_STATUS = 0

16     BEGIN

17         PRINT @ProdName            

18         FETCH NEXT FROM curProduct INTO @ProdID, @ProdName

19     END

20 

21 CLOSE curProduct

22 DEALLOCATE curProduct

23 ---------------------------------------------
View Code

 CASE用法1

 1 USE AdventureWorks2008

 2 GO

 3 SELECT  ProductID ,

 4         Name ,

 5         ListPrice ,

 6         ProductSubcategoryID ,

 7         CASE ProductSubcategoryID

 8           WHEN 1 THEN 'Mountain Bike'

 9           WHEN 2 THEN 'Road Bike'

10           WHEN 3 THEN 'Touring Bike'

11           WHEN NULL THEN 'Something Else'

12           ELSE '(No SubCategory)'

13         END AS SubCategory

14 FROM    Production.Product

15 ----------------------------------------
View Code

 CASE用法2

SELECT  ProductID ,

        Name ,

        ListPrice ,

        ProductSubcategoryID ,

        SubCategory = CASE ProductSubcategoryID

                        WHEN 1 THEN 'Mountain Bike'

                        WHEN 2 THEN 'Road Bike'

                        WHEN 3 THEN 'Touring Bike'

                        WHEN NULL THEN 'Something Else'

                        ELSE '(No Subcategory)'

                      END

FROM    Production.Product

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

 自动增长列操作1

SET IDENTITY_INSERT myTable ON --关闭自动增长

INSERT myTable(myID, myDescription)

VALUES(5,'This will work')

SET IDENTITY_INSERT myTable OFF --开启自动增长

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

 表连接

http://blog.163.com/ji_1006/blog/static/10612341201310221261829/

 

 

 

你可能感兴趣的:(t-sql)