SQL

匯出匯入

Json匯出 How to export a table to JSON file in SQL Server? | My Tec Bits

Collate 處理

查找

SELECT COLUMN_NAME, COLLATION_NAME,DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'schema_name' 
AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'column_name'

-- example
SELECT table_name, column_name, collation_name
FROM information_schema.columns
WHERE table_name in ('LicenseFormHeader','LicenseFormLine') and table_schema = 'license'

查詢條件加上

//條件加
v.ProductCode = i.InvItemNo  collate Chinese_PRC_CI_AS

變更Table Column

ALTER TABLE table_name
ALTER COLUMN column_name [data_type]
COLLATE Chinese_PRC_CI_AS

建造時設定

CREATE TABLE table_name (
    column1_name [data_type] COLLATE Chinese_PRC_CI_AS,
    column2_name [data_type] COLLATE Chinese_PRC_CI_AS,
    ...
)

DeadLock 問題

必要條件

  • Mutual exclusion:某些資源在同一個時間點最多只能被一個 process 使用
  • Hold and wait:某 process 持有部分資源,並等待其他 process 正在持有的資源
  • No preemption:process 不可以任意強奪其他 process 所持有的資源
  • Circular waiting:系統中存在一組 processes,其中等待所持有的資源 等待其他processes 所持有的資源,形成循環式等待。(因此,deadlock不會存在於single process環境中)

查詢Table size

SELECT t.NAME AS TableName,SCHEMA_NAME(t.schema_id) as ServiceName,
(SUM(a.total_pages) * 8) / 1024.0 as TotalSpaceMB, 
(SUM(a.total_pages) * 8) / 1024.0 * 100 / (SELECT SUM(total_pages) * 8 / 1024.0 FROM sys.allocation_units) as Percentage
FROM sys.tables t 
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id 
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id 
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id 
WHERE i.OBJECT_ID > 255 AND i.index_id IN (0,1) 
GROUP BY t.NAME ,t.schema_id
ORDER BY TotalSpaceMB DESC

執行計畫

SQL 基本語法

  1. 同時設定為auto increment 和 primary key
ALTER TABLE  [self].[ModelEntryLog]
ADD  ApiLogId   INT IDENTITY(1,1)
CONSTRAINT PK_ModelEntryLog PRIMARY KEY CLUSTERED
  1. 拿掉primary key 限制
ALTER TABLE [self].[ModelEntryLog]
DROP CONSTRAINT PK__ModelEnt__F842F02069FD48C7
  1. 單獨新增為primary key
ALTER TABLE  [self].[ModelEntryLog] ADD PRIMARY KEY (ApiLogId)
  1. alter column
ALTER TABLE [dbo].[TableName] ALTER COLUMN [dbo.ID] BIGINT
  1. create table
CREATE TABLE MyTable
(   seq Bigint IDENTITY(1,1),
    MyColumn VARCHAR(50) COLLATE Chinese_PRC_CI_AS
    MyOtherColumn NVARCHAR(100) COLLATE Chinese_PRC_CI_AS
    PRIMARY KEY (ID)
)
  1. covert date
SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15'
  1. DateAdd
SELECT TOP (100) * FROM [dpl].[WhiteListDetail] WHERE convert(date,LastUpdatedDate) = DATEADD(DAY,-1, convert(date,GETUTCDATE()))
  1. Cast at Time Zone
CAST(LastUpdatedDate AT TIME ZONE 'UTC' AS DATE)
  1. find max
SELECT MAX(CAST(LastUpdatedDate AT TIME ZONE 'UTC' AS DATE))
  1. RowNumber()
--分組排序
select ROW_NUMBER() OVER (PARTITION BY address ORDER BY id ASC) as ROW_ID ,* from Customers

[iT鐵人賽Day34]SQL Server 實用的排序函數 ROW_NUMBER() - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)

  1. delete duplcaiton
WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY column1, column2, column3 ORDER BY lastupdated DESC) AS rn
    FROM table_name
)
DELETE FROM CTE WHERE rn > 1;
  1. FIND SUSPEND SESSION
SELECT r.session_id,
    r.status AS [指令狀態],
    r.command AS [指令類型],
    r.wait_time/1000.0 AS [等待時間()],
    s.client_interface_name AS [連線資料庫的驅動程式],
    s.host_name AS [電腦名稱],
    s.program_name AS [執行程式名稱],
    t.text AS [執行的SQL語法],
    r.blocking_session_id AS [被鎖定卡住的session_id]
    FROM sys.dm_exec_requests r
    INNER JOIN sys.dm_exec_sessions s
    ON r.session_id = s.session_id
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
    WHERE s.is_user_process = 1;
  1. 正在執行的程序
EXEC sp_who2;
  1. sql for loop 刪除資料
DECLARE @id INT;
DECLARE @count INT = 1;

WHILE @count > 0
BEGIN
    SELECT TOP 1 @id = id FROM table_name WHERE condition;
    SET @count = @@ROWCOUNT;
    IF @count > 0
    BEGIN
        DELETE FROM table_name WHERE id = @id;
    END
END
  1. find expensive sql
SELECT TOP 10
    total_worker_time/execution_count AS AvgCPU,
    total_logical_reads/execution_count AS AvgReads,
    total_logical_writes/execution_count AS AvgWrites,
    execution_count,
    total_elapsed_time/execution_count AS AvgElapsedTime,
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
        ((CASE qs.statement_end_offset
            WHEN -1 THEN DATALENGTH(st.text)
            ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2)+1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time DESC;

SQL SERVER - List Expensive Queries - Updated March 2021 - SQL Authority with Pinal Dave

  1. create index
CREATE INDEX IX_Name
ON  table ( field);
with temp as (

)select temp.* from sublog join on where exists(

)