SQL - Transact-SQL

SQL - Transact-SQL

LAVI

T-SQL Programming Elements

Introducing T-SQL Batches

針對如果有批次執行,就可以在每個 statement 後加上執行
GO 不屬於 SQL 的函式,需藉由 SSMS 設定識別命令

Introducing T-SQL Variables

利用 DECLARE 來宣告變數

1
DECLARE @parameter1 INT = 1;

或是利用 SET 來賦予變數值

1
2
DECLARE @parameter2 NVARCHAR(10);
SET @parameter2 = N'String';

也可以用 SELECT 來賦予變數值

1
2
3
DECLARE @paramter3 NVARCHAR(max);
SELECT @paramter3 = BOOK_ID
FROM BOOK_DATA;

結合 GO 批次執行可以寫成這樣

1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @parameter1 INT = 1;

DECLARE @parameter2 NVARCHAR(10);
SET @parameter2 = N'String';

DECLARE @parameter3 NVARCHAR(max);
SELECT @parameter3 = BOOK_ID
FROM BOOK_DATA
WHERE BOOK_NAME = 'XML Step BY Step';

SELECT @parameter1 AS parameter1, @parameter2 AS parameter2, @parameter3 AS parameter3;
GO

結果會輸出

parameter1 parameter2 parameter3
1 String 50

Working with Synonyms

Synonyms 是對在本機或遠端伺服器上的另外一個資料庫物件設定別名
該物件可以是 table、view、procedure、function

可以利用 CREATEALTERDROP 來建立、修改、刪除

範例:
CREATE 一個 Procedure,使用資料庫 TSQL2023

1
2
3
4
5
6
7
CREATE PROC SchemaName1.StoredProcedureName1
(@parameter1 AS INT, @parameter2 AS INT)
AS
SELECT TOP (@parameter1) BOOK_ID, BOOK_NAME
FROM BOOK_DATA
WHERE BOOK_ID = @parameter2
GO

然後執行,觀察輸出

1
2
DECLARE @parameter1 INT = 3, @parameter2 INT = 50;
EXEC SchemaName1.StoredProcedureName1 @parameter1 = @parameter1, @parameter2 = @parameter2;

切換至其他資料庫 TSQL0706 後,CREATE SYNONYM,來源是剛剛的資料庫 TSQL2023 裡的 Procedure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE PROC SchemaName.StoredProcedureName1
(@parameter1 AS INT, @parameter2 AS INT)
AS
SELECT TOP (@parameter1) BOOK_ID, BOOK_NAME
FROM BOOK_DATA
WHERE BOOK_ID = @parameter2
GO

USE TSQL0706;
GO

CREATE SYNONYM SchemaName.StoredProcedureName2
FOR TSQL2023.SchemaName.StoredProcedureName1
EXEC SchemaName.StoredProcedureName2 @parameter1 = 3, @parameter2 = 50;
GO

SELECT *
FROM sys.synonyms s;
GO

結果會輸出
object、schema_id、name、create_date、modify_date、bas_object_name.. 等等資訊

Controlling Program Flow

Understanding T-SQL Control-of-Flow Language

  1. IF…ELSE

    1
    2
    3
    4
    5
    6
    7
    8
    IF OBJECT_ID ('SchemaName.tableName') IS NULL
    PRINT 'Object doesn't exit';
    ELSE
    DROP TABLE SchemaName.tableName;
    IF EXISTS (SELECT * FROM SchemaName.tableName WHERE column1 = 1)
    SELECT 'column 1 exists!';
    ELSE
    SELECT 'column 1 not exists';
  2. WHILE
    WHILE 會搭配 BEGIN END 做使用,也可以搭配 BREAKCONTINUE

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @parameterCnt INT = 1, @parameterName NVARCHAR(20);
    WHILE @parameterCnt <= 5
    BEGIN
    SELECT @parameterName = BOOK_NAME FROM BOOK_DATA
    PRINT @parameterName;
    SET @parameterCnt += 1;

    CONTINUE
    PRINT '這裡不會執行到'
    END;