SQL SERVER 日志記錄


-- 查詢區分大小寫: WHERE COLLATE Chinese_PRC_CS_AI

-- 建立索引
CREATE INDEX IDX_DRP_HN_RLB_1
    ON DRP_HN_RLB (SHOP_CODE, FSCL_DATE)

CREATE INDEX IDX_DRP_HN_RLB_2
    ON DRP_HN_RLB (SHOP_CODE, V5_ORDER_NUM)

CREATE INDEX IDX_DRP_HN_RLB_DTL_1
    ON DRP_HN_RLB_DTL (V5_ORDER_NUM, PROD_CODE)

CREATE INDEX IDX_DRP_HN_RLB_PAY_1
    ON DRP_HN_RLB_PAY (V5_ORDER_NUM)
    
    
-- 刪除主鍵約束
    ALTER TABLE DRP_HN_RLB DROP CONSTRAINT DRP_HNN_RLB
-- 增加主鍵約束 
ALTER TABLE DRP_HN_RLB ADD CONSTRAINT PK_DRP_HN_RLB PRIMARY KEY(SHOP_CODE,V5_ORDER_NUM)
-- 增加字段
ALTER TABLE DRP_HN_RLB_DTL ADD SHOP_CODE VARCHAR(25)
ALTER TABLE DRP_HN_RLB_PAY ADD SHOP_CODE VARCHAR(25)

-- ALTER TABLE DRP_HN_RLB_DTL ADD CONSTRAINT PK_DRP_HN_RLB_DTL PRIMARY KEY(SHOP_CODE,V5_ORDER_NUM)
-- ALTER TABLE DRP_HN_RLB_PAY ADD CONSTRAINT PK_DRP_HN_RLB_PAY PRIMARY KEY(SHOP_CODE,V5_ORDER_NUM)    

-- 增加字段指定值約束
ALTER TABLE DRP_HN_RLB WITH CHECK ADD CONSTRAINT [CKC_RLB_HANDLED] CHECK (([HANDLED]='F' OR [HANDLED]='T'))
ALTER TABLE DRP_HN_RLB CHECK CONSTRAINT [CKC_RLB_HANDLED]

ALTER TABLE DRP_HN_RLB_DTL WITH CHECK ADD CONSTRAINT [CKC_RLB_DTL_HANDLED] CHECK (([HANDLED]='F' OR [HANDLED]='T'))
ALTER TABLE DRP_HN_RLB_DTL CHECK CONSTRAINT [CKC_RLB_DTL_HANDLED]

ALTER TABLE DRP_HN_RLB_PAY WITH CHECK ADD CONSTRAINT [CKC_RLB_PAY_HANDLED] CHECK (([HANDLED]='F' OR [HANDLED]='T'))
ALTER TABLE DRP_HN_RLB_PAY CHECK CONSTRAINT [CKC_RLB_PAY_HANDLED]

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

alter table SCM_UNIT_GRID alter column ROW_BG VARCHAR(1000); 
DROP INDEX IDX_MTU_2 ON MTU;

CREATE INDEX IDX_MTU_2 ON dbo.MTU (DELIV_UNIT_ID, DELIV_WAREH_ID);

alter table mtu alter column deliv_wareh_id numeric(6) NOT NULL;


-------------------- for xml path -----------------------

SELECT b.code_type,ccc FROM 
( SELECT code_type,
                  ( SELECT description+' | ' FROM SYS_CODE_DTL  WHERE CODE_TYPE = a.code_type FOR XML path('')
                  ) AS ccc 
  FROM SYS_CODE_DTL A 
  GROUP BY code_type 
) B 

-------------END-----------

---- 查詢結果排序 ---------

SELECT '昨日' AS S_DD,'昨至今前十門店: ' AS S_NAME,convert(VARCHAR(10),rn)+'. '+ shop_name AS V_SHOP,qty AS S_NUM,val AS S_VAL,DISC as DISC 
 FROM (

       SELECT row_number() OVER(ORDER BY val DESC) rn,c.*  -- 按金額降序
        FROM (
               SELECT shop_name,sum(qty) qty,sum(val) val,avg(DISC_rate) DISC FROM dao_au_sale
                WHERE convert(varchar(10),doc_date,120) >= convert(VARCHAR(10),getdate()-1,120)
                GROUP BY shop_name
         
             ) c
      ) c WHERE rn <= 11 -- 展現前 11 行
-------------------END-----------------------------

------------- 數值轉字符 | 時段|環比|同比 -------------- BETWEEN :FROM_DATE AND :TO_DATE [時段參數]

SELECT '時段' AS S_DD,'日期選擇: ' AS S_NAME,
       'SALE 其中 V:    '+ (SELECT convert(VARCHAR(50),cast(sum(qty) as int)) + ' / '+convert(VARCHAR(50),sum(val)) -- 數值轉字符
                              FROM dao_au_sale 
                             WHERE doc_date BETWEEN :FROM_DATE AND :TO_DATE
                               AND prsnl_code IS NOT NULL
                           ) AS V_SHOP, 
       sum(qty) AS S_NUM,sum(val) AS S_VAL,avg(DISC_rate) DISC FROM dao_au_sale WHERE doc_date BETWEEN :FROM_DATE AND :TO_DATE
       
       
UNION ALL 

SELECT '環比' AS S_DD,'日期選擇: ' AS S_NAME,
       'SALE 其中 V:    '+ (SELECT convert(VARCHAR(50),cast(sum(qty) as int)) + ' / '+convert(VARCHAR(50),sum(val)) 
                              FROM dao_au_sale 
                             WHERE doc_date BETWEEN DateAdd(month, -1, :FROM_DATE) AND DateAdd(month, -1, :TO_DATE)    --- 環比【上月同一時段】
                               AND prsnl_code IS NOT NULL
                           ) AS V_SHOP, 
        sum(qty) AS S_NUM,sum(val) AS S_VAL,avg(DISC_rate) DISC FROM dao_au_sale WHERE doc_date BETWEEN DateAdd(month, -1, :FROM_DATE) AND DateAdd(month, -1, :TO_DATE)
        
UNION ALL 

SELECT '同比' AS S_DD,'日期選擇: ' AS S_NAME,
       'SALE 其中 V:    '+ (SELECT convert(VARCHAR(50),cast(sum(qty) as int)) + ' / '+convert(VARCHAR(50),sum(val)) 
                              FROM dao_au_sale 
                             WHERE doc_date BETWEEN DateAdd(year, -1, :FROM_DATE) AND DateAdd(year, -1, :TO_DATE)       --- 同比 【上年同一時段】
                               AND prsnl_code IS NOT NULL
                           ) AS V_SHOP, 
       sum(qty) AS S_NUM,sum(val) AS S_VAL,avg(DISC_rate) DISC FROM dao_au_sale WHERE doc_date BETWEEN DateAdd(year, -1, :FROM_DATE) AND DateAdd(year, -1, :TO_DATE)
             
----------------------- END --------------------------------------------------********************

是數字 NOT LIKE '%[^0-9]%'
是字母 NOT LIKE '%[^A-Za-z]%'


-- < 日期 >

-- getdate() 獲得當前日期函數

SELECT getdate()


-- dateadd() 指定增加日期函數
-- 在指定的日期值上增加指定的日期值 ( mm 月 ,yy 年 ,dd 日 )

select dateadd(mm,3,getdate()) 
select dateadd(dd,40,getdate())
select dateadd(mm,-3,getdate())

-- datediff(,,)差異日期函數 | 獲得兩個指定日期之間的差異值

select Age, Classid,datediff(yyyy,Birthday,getdate()) from Teacher 

-- 查詢年齡在15-20歲之間的女生信息

 select * from Teacher where datediff(yyyy,Birthday,getdate()) between 15 and 20 and Gender = 'False'
 select datediff(ss,'1999-9-9',getdate())
 
-- dateName()返回日期中部分字符串函數 | 得到日期的字符串部分

select Datename(weekday,getdate())
select Datename(month,getdate())

-- datepart()返回日期中指定日期部分的整數形式函數 | 日期中指定日期部分的整數形式

select DatePart(day,getdate())
select datepart(day,'2018-10-16')


今天的所有數據:select * from 表名 where DateDiff(dd,datetime類型字段,getdate())=0

昨天的所有數據:select * from 表名 where DateDiff(dd,datetime類型字段,getdate())=1

7天內的所有數據:select * from 表名 where DateDiff(dd,datetime類型字段,getdate())<=7

30天內的所有數據:select * from 表名 where DateDiff(dd,datetime類型字段,getdate())<=30

本月的所有數據:select * from 表名 where DateDiff(mm,datetime類型字段,getdate())=0

本年的所有數據:select * from 表名 where DateDiff(yy,datetime類型字段,getdate())=0

 

查詢今天是今年的第幾天: select datepart(dayofyear,getDate())

查詢今天是本月的第幾天:1. select datepart(dd, getDate()) 

                        2.select day(getDate())

查詢本周的星期一日期是多少 (注意:指定日期不能是周日,如果是周日會計算到下周一去。所以如果是周日要減一天) SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0)

 

查詢昨天日期:select convert(char,dateadd(DD,-1,getdate()),111//111是樣式號,(100-114)

 

查詢本月第一天日期:Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) as firstday

查詢本月最后一天日期:Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) as lastday      //修改-3的值會有相應的變化

 

本月有多少天:select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast((cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' ) as datetime ))))

 

求兩個時間段相差幾天:select datediff(day,'2012/8/1','2012/8/20') as daysum

在指定的日期上±N天:select convert(char,dateadd(dd,1,'2012/8/20'),111) as riqi    //輸出2012/8/21

在指定的日期上±N分鍾:select dateadd(mi,-15,getdate())  //查詢當前時間15分鍾之前的日期
--------------------- 

-- **************************************************************************************** --




-- 輸出轉換 cast() | convert()

PRINT 1+1

PRINT 56/8

PRINT '我的成績是:' + cast(100 as char(13))  + 'into '

print '我的生日是:'+'1999-9-9'
print'我的生日是:'+convert(char(20),'1999-9-9',100)

print'我的生日是:'+convert(char(20),getdate(),100) --100 日期顯示的格式不同
print'我的生日是:'+convert(char(20),getdate(),101)
print'我的生日是:'+convert(char(20),getdate(),102)
print'我的生日是:'+convert(char(20),getdate(),103)


-- 字符串函數 charindex() | len() | upper() / lower() 大小寫轉換 | ltrim() / rtrim() 左右去空格 |

select charindex('am','I am a boy',0)
select charindex('am','I am a boy',3)
select charindex('am','I am a boy',5)
select charindex('atm','I am a boy')

select len('I am a boy')


-- right()

select right ('I am a boy' ,3)

-- substring()

select substring ('I trust you will say I am a boy',charindex('am','Trust me ,I am really a boy!'),2)

-- replace()

select REPLACE('I am a smart boy ', 'smart', 'clever')    

-- stuff() 在一個字符串中,從指定位置刪除指定長度的字符,並在該位置插入一個新的字符 ,從1開始。參數1:字符串 參數2:指定位置,參數3:刪除指定長度,參數4:插入的新字符串

select stuff('I am a clever boy',8,6,'elegant')

-- 聲明變量

DECLARE @age INT

-- 變量賦值

SET @age = 26

-- while 循環

DECLARE @i int 
SET @i= 1 
WHILE @i <= 10
    BEGIN 
       @i= @i + 1 
       PRINT @i
    END 

declare @x int
set @x = 1
while(@i <= 3)  
begin
set @x = @x + 1
print @x
end

-- if else 

    if @i>10
        begin
            print '大於10'
        end
    else if @i>5
        begin
            print '大於5'
        end
    else
        begin
            print '小於等於5'
        END
        
-- 系統變量

    @@version: 返回  SQL Server的當前安裝的系統和生成信息。
    @@error: 上一條sql語句出錯,會有錯誤號;上一條sql執行沒出錯,則為0。
    @@lanuage: 返回當前所用語言的名稱。

    @@max_connections:  返回 SQL Server實例允許同時進行的最大用戶連接數。(實際允許的用戶連接數還依賴於所安裝的  SQL Server的版本以及應用程序和硬件的限制)
    @@Rowcount: 上一條sql語句影響的行數。
    @@servername: 返回正在運行  SQL Server的本地服務器的名稱。

    @@connections: 此函數返回  SQL Server自上次啟動以來嘗試的連接數,無論連接是成功還是失敗。

-- 事務

    一個事務中,不能一個sql語句執行成功,一個執行失敗。只要有一個sql語句執行失敗,就是失敗。

    自動提高事務:當執行一條sql語句,數據庫自動打開一個事務,執行成功->自動提交,執行失敗->自動回滾。

    隱式事務:當執行一條sql語句,數據庫自動打開一個事務,需要手動提交,手動回滾。(打開隱式事務:set implicit_Transactions ON)

    顯式事務:需要手動打開事務,手動提交,手動回滾。

    打開一個事務:
    
    begin transaction
        declare @sum int=0
        update tableA set Name='大胡子' where id=2
        set @sum=@sum+@@error
        update tableB set Name='大胡子' where id=2
        set @sum=@sum+@@error
        if @sum<>0
            begin
                rollback --回滾,也可寫rollback transaction
            end
        else
            begin
                commit  --提交,也可寫commit transaction
            END
            
-- 游標 cursor

    declare Mycursor cursor for
        select UserName,Age,Email from tbUsers
        
        open Mycursor
        declare @uName varchar(50)
        declare @uAge int
        declare @uEmail varchar(50)
        fetch next from Mycursor into @uName,@uAge,@uEmail
        if (@@fetch_status=0)
        begin
            print @uName
            print @uAge
            print @uEmail
        end
    close Mycursor
    

-- 觸發器 trigger

  觸發器是數據庫服務器中發生事件時自動執行的一種特殊存儲過程。

  DML觸發器:如果用戶要通過數據操作語言 (DML) 事件編輯數據,則執行 DML 觸發器。

        表或視圖的 insert, delete, update語句(不支持select)。

  DDL觸發器:DDL 觸發器用於響應各種數據定義語言 (DDL) 事件。

        這些事件主要對應於  Transact-SQL CreateAlterDrop 語句,以及執行類似 DDL 操作的某些系統存儲過程。

  登錄觸發器: 登錄觸發器在遇到 Login 事件時觸發,該事件是在建立用戶會話時引發的。

  創建觸發器:
  
     create trigger trg_In ON tbUsers
      after delete
      as
        begin
            insert into tbUsers_backup(Name,Age,Email) select Name,Age,Email from deleted
        end 
    
-- ******************************************************** --

-- 獲取本周周一

SELECT DATEADD(Day,(@i+1)-(DATEPART(Weekday,getdate())+@@DATEFIRST-1)%7,getdate()) 


---- datediff()

datepart    縮寫
年    yy, yyyy
季度    qq, q
月    mm, m
年中的日    dy, y
日    dd, d
周    wk, ww
星期    dw, w
小時    hh
分鍾    mi, n
秒    ss, s
毫秒    ms
微妙    mcs
納秒    ns

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

全局變量使用@@來表示,一般都是系統預定義的一些全局變量。常用的全局變量有

@@ERROR            最后一個SQL錯誤的錯誤號

@@IDENTITY         最后一次插入的標識值

@@LANGUAGE         當前使用的語言的名稱

@@MAX_CONNECTIONS  可以創建的同時連接的最大數目

@@ROWCOUNT         受上一個SQL語句影響的行數

@@SERVERNAME       本地服務器的名稱

@@TRANSCOUNT       當前連接打開的事物數

@@VERSION          SQL Server的版本信息

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

PRINT @@VERSION

SELECT @@TRANCOUNT
SELECT @@ERROR 


------- SQL 透視用法 ------


SELECT <非透視的列>,
    [第一個透視的列] AS <列名稱>,
    [第二個透視的列] AS <列名稱>,
    ...
    [最后一個透視的列] AS <列名稱>,
FROM
    TABLE_NAME
PIVOT
(
    <聚合函數>(<要聚合的列>)
FOR
[<包含要成為列標題的值的列>]
    IN ([第一個透視的列], [第二個透視的列],
    ... [最后一個透視的列])
) AS <透視表的別名>
<可選的 ORDER BY 子句>


-- 例:

SELECT [2020春],[2020夏]
  FROM (SELECT season,sum(qty) AS qty FROM dao_au_sale WHERE datediff(dd,DOC_DATE,getdate()) = 1 GROUP BY season) a
  PIVOT 
  (sum(qty) FOR season IN ([2020春],[2020夏])) pt 


 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM