顯示具有 MSSQL 標籤的文章。 顯示所有文章
顯示具有 MSSQL 標籤的文章。 顯示所有文章

2026年3月18日 星期三

MS-SQL 分頁

引用來源: [MSSQL]分頁

---

方法一 : 使用ROW_NUMBER()搭配OVER(ORDER BY Field)(SQL Server 2008 開始)

ROW_NUMBER()

ROW_NUMBER ( )

    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

先用ROW_NUMBER()替每筆資料設定編號,再根據條件取得分頁內容(ROW_NUMBER從1開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT * FROM

(

    SELECT

        *, ROW_NUMBER() OVER (ORDER BY FieldA DESC) as RowId

    FROM

        TableA

    WHERE

        Conditions

) AS vw

WHERE

    RowId BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize

方法二 : 使用OFFSET搭配FETCH(SQL Server 2012 開始)

OFFSET FETCH


OFFSET - FETCH 是 ORDER BY 子句的延伸功能。


FETCH

          [ [ NEXT | PRIOR | FIRST | LAST

                    | ABSOLUTE { n | @nvar }

                    | RELATIVE { n | @nvar }

               ]

               FROM

          ]

{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }

[ INTO @variable_name [ ,...n ] ]

可以指定跳過的行數,指定要取回的資料列筆數(要從跳過 0 ROW開始)

DECLARE @PageIndex INT = 1, @PageSize INT = 25


SELECT

    *

FROM

    TableA

ORDER BY

    FieldA DESC

OFFSET (@PageIndex - 1)*@PageSize ROWS

FETCH NEXT @PageSize ROWS ONLY;

FETCH 寫法效能比 ROW_NUMBER() 快很多


2026年1月22日 星期四

MS-SQL 找尋 約束

 /*顯示資料內所有約束*/

SELECT * FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP')

/*找詢約束*/

if (SELECT count(name) FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('A_TMP') and name='A_prod_name')>0

begin

   print '1'

end 

else

begin

   print '0'

end

2025年11月3日 星期一

SQL 取資料表所有欄位

 


SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE

FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table name'

2025年8月18日 星期一

MSSQL DATALENGTH 尾端空白字串


select '0022000114693',len('0022000114693'),len('0022000114693 '),DATALENGTH('0022000114693'),DATALENGTH('0022000114693 ')


值變化:



2025年5月14日 星期三

TRY CATCH

 在較早的 SQL 版本,要檢測 TSQL 是否有發生執行錯誤,都只能透過判斷 @@ERROR 全域變數,直到 SQL2005 才新增了 TRY...CATCH 這個結構化的例外處理功能。 它採用和程式語言中的 TRY...CATCH 類似的語法,在 TRY 區塊內放的是一般陳述式,CATCH 區塊內放的是錯誤處理的陳述式。


使用 TRY...CATCH 結構,若執行的 TSQL 發生了錯誤,錯誤訊息將不會傳到呼叫端,除非透過 RAISERROR 再送出錯誤訊息。


取得錯誤訊息的函式:

當使用 TRY...CATCH 時,你可以在 CATCH 區塊中使用以下函式以取得與錯誤訊息相關的資訊:


ERROR_NUMBER :發生錯誤的錯誤代碼

ERROR_MESSAGE :發生錯誤的錯誤訊息

ERROR_SEVERITY :發生錯誤的錯誤層級

ERROR_STATE :發生錯誤的錯誤狀態

ERROR_PROCEDURE :發生錯誤的程序名稱

ERROR_LINE :發生錯誤的行數

BEGIN TRY

INSERT Emp(EmpName, DepNo) Values (@EmpName, 1) 

INSERT Emp(EmpName, DepNo) Values (@EmpName, 1) 

END TRY

BEGIN CATCH

    PRINT '錯誤代碼:' + cast(ERROR_NUMBER() as varchar(5)) + char(13) +

  '錯誤訊息:' + ERROR_MESSAGE()

    RAISERROR('資料寫入錯誤',16,10)

END CATCH; 

以上函式,若不是在 CATCH 區塊中使用,都將回傳 NULL 。


2025年3月3日 星期一

2025年2月4日 星期二

MSSQL stored procedure TRY...CATCH

參考來源:TRY...CATCH (Transact-SQL)


 BEGIN TRY

SELECT  aa/0 FROM DEMO

END TRY


BEGIN CATCH

    SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;

END CATCH




2024年11月15日 星期五

2024年10月7日 星期一

MS-SQL while

   declare @go_qty int

  set @go_qty=1

  while (@go_qty<=2)

  begin

     print @go_qty

set @go_qty+=1

 

  end



2024年8月19日 星期一

2024年8月18日 星期日

SqlConnection.ConnectionTimeout Property

 參考引用:SqlConnection.ConnectionTimeout

---

private static void OpenSqlConnection()

{

    string connectionString = GetConnectionString();

    using (SqlConnection connection = new SqlConnection(connectionString))

    {

        connection.Open();

        Console.WriteLine("State: {0}", connection.State);

        Console.WriteLine("ConnectionTimeout: {0}",

            connection.ConnectionTimeout);

    }

}


static private string GetConnectionString()

{

    // To avoid storing the connection string in your code,

    // you can retrieve it from a configuration file, using the

    // System.Configuration.ConfigurationSettings.AppSettings property

    return "Data Source=(local);Initial Catalog=AdventureWorks;"

        + "Integrated Security=SSPI;Connection Timeout=30";

}


2024年7月31日 星期三

撰寫Stored Procedure小細節

 參考引用:[SQL SERVER]撰寫Stored Procedure小細節

---

撰寫Stored Procedure小細節


EXEC AssetLibrary_AssetDeleteAttributes @AssetID



declare @myquery nvarchar(4000);

set @myquery = 'SELECT * from dbo.test2 where c1 = @id';

--第一次

execute sp_executesql @myquery,N'@id int', @id = 1;

--第二次

execute sp_executesql @myquery,N'@id int', @id = 2;

--查看執行計畫

SELECT cap.usecounts as '使用次數',objtype as '快取類型',st.text

FROM sys.dm_exec_cached_plans cap

CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st

WHERE st.text not like '%sys%'

and st.text like '%dbo.test2%'




DECLARE @myquery VARCHAR(8000)

,@myid int;

set @myid = 5;

set @myquery = 'select * from dbo.test2 where c1 = '+ CAST( @myid as varchar);

--第一次

exec (@myquery) 

set @myid = 6; 

set @myquery = 'select * from dbo.test2 where c1 = '+ CAST(@myid as varchar );

--第二次

exec (@myquery) 

SELECT cap.usecounts as '使用次數',objtype as '快取類型',st.text            

FROM sys.dm_exec_cached_plans cap

CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st

WHERE st.text not like '%sys%'

and st.text like '%dbo.test2%'


2023年11月6日 星期一

資源集區'internal' 中的系統記憶體不足,無法執行此查詢

 sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'max server memory', 2147483647;

GO

RECONFIGURE;

GO

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


EXEC sp_configure 'show advanced options', '1' RECONFIGURE WITH OVERRIDE;

EXEC sp_configure 'max server memory', 2147483647 RECONFIGURE WITH OVERRIDE;

EXEC sp_configure 'show advanced options', '0' RECONFIGURE WITH OVERRIDE;


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


 DBCC FREESYSTEMCACHE ('ALL'); --釋放所以在快取內,未被使用的項目

 DBCC FREEPROCCACHE; --從計畫快取移除所有元素

 DBCC DROPCLEANBUFFERS; --清除緩衝區裡面的所有暫存項目

 DBCC FREESESSIONCACHE; --清除所有查詢所使用的分散式連線快取

2023年9月24日 星期日

WAITFOR (Transact-SQL)

 引用來源:WAITFOR (Transact-SQL)

----

範例

A. 使用 WAITFOR TIME

下列範例會在下午 10:20 (22:20) 執行 msdb 資料庫中的預存程序 sp_update_job。


SQL


複製

EXECUTE sp_add_job @job_name = 'TestJob';  

BEGIN  

    WAITFOR TIME '22:20';  

    EXECUTE sp_update_job @job_name = 'TestJob',  

        @new_name = 'UpdatedJob';  

END;  

GO  

B. 使用 WAITFOR DELAY

下列範例會在延遲兩小時之後執行預存程序。


SQL


複製

BEGIN  

    WAITFOR DELAY '02:00';  

    EXECUTE sp_helpdb;  

END;  

GO  

C. 搭配本機變數來使用 WAITFOR DELAY

下列範例顯示如何搭配 WAITFOR DELAY 選項來使用本機變數。 這預存程序會等待一陣可變的時段,再將經歷的時、分、秒數資訊傳回給使用者。


SQL


複製

IF OBJECT_ID('dbo.TimeDelay_hh_mm_ss','P') IS NOT NULL  

    DROP PROCEDURE dbo.TimeDelay_hh_mm_ss;  

GO  

CREATE PROCEDURE dbo.TimeDelay_hh_mm_ss   

    (  

    @DelayLength char(8)= '00:00:00'  

    )  

AS  

DECLARE @ReturnInfo VARCHAR(255)  

IF ISDATE('2000-01-01 ' + @DelayLength + '.000') = 0  

    BEGIN  

        SELECT @ReturnInfo = 'Invalid time ' + @DelayLength   

        + ',hh:mm:ss, submitted.';  

        -- This PRINT statement is for testing, not use in production.  

        PRINT @ReturnInfo   

        RETURN(1)  

    END  

BEGIN  

    WAITFOR DELAY @DelayLength  

    SELECT @ReturnInfo = 'A total time of ' + @DelayLength + ',   

        hh:mm:ss, has elapsed! Your time is up.'  

    -- This PRINT statement is for testing, not use in production.  

    PRINT @ReturnInfo;  

END;  

GO  

/* This statement executes the dbo.TimeDelay_hh_mm_ss procedure. */  

EXEC TimeDelay_hh_mm_ss '00:00:10';  

GO  

以下為結果集。


A total time of 00:00:10, in hh:mm:ss, has elapsed. Your time is up.