此篇主要紀錄SSMS的相關設定、撰寫Stored Procedure相關要點、SQL語法。
T-SQL 相關語法設定與函數 :
- 標準化 WHERE COLUMNNAME = NULL
SET ANSI_NULLS ON
- 再SSMS中Tsql的指令可接受雙引號『 " 』
SET QUOTED_IDENTIFIER OFF
- 不回傳受影響資料筆數的資訊
強調 : 自訂程序中使用 SET NOCOUNT ON 陳述式。在C#中使用 SqlCommand.ExecuteNonQuery 方法的回傳值永遠是 -1。
SET NOCOUNT ON
- 該函數表示當前受影響資料筆數
@@ROWCOUNT
- 若影響資料筆數超過20億,只能使用以下函數。不過該函數對小弟來說如同虛設。
ROWCOUNT_BIG()
- 使用該函數得知修改資料時有無發生錯誤
@@Error
演示 Stored Procedure撰寫方法 && 在SSMS中使用方式 :
撰寫預存程序 :
USE [資料庫名稱] /*會在該資料庫中產生該預存程序*/
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [預存程序的名稱](@TbName NVARCHAR(50),@OutP INT = NULL OUT)
/*
應把該程序的目的註解起來且包含著注意要點
--該程序是取得資料表的總筆數
--參數 1.TB名稱
--若找無資料表或欄位名稱時 找無TB RETURN 1
--若查詢時發生錯誤,系統報錯。並回傳 -1
--若預設值都正確,找到資料後或無找無資料 RETURN 0 ,
--輸出參數 @OutP 回傳找到的數量。
*/
AS
BEGIN
SET NOCOUNT ON;
EXEC @spReturn = [dbo].[CheckSpHave_TableOrColumn] @TbName /*使用預存程序檢查TB是否存在*/
IF @spReturn <> 0 BEGIN RETURN @spReturn END
DECLARE @sqlcmd NVARCHAR(100) = ''
SET @sqlcmd = @sqlcmd + N'SELECT @OutP = COUNT(*)FROM '+@TbName
BEGIN TRY
BEGIN
/*使用T-SQL中的函數執行含有輸出參數的字串*/
EXEC [dbo].sp_executesql @sqlcmd,N'@OutP int OUTPUT',@OutP OUT
RETURN 0
END
END TRY
BEGIN CATCH
PRINT N'Error Line: ' + CONVERT(NVARCHAR(100),ERROR_LINE())
PRINT N'Error Number: '+CONVERT(NVARCHAR(100),ERROR_NUMBER())
PRINT N'Error Message: ' +CONVERT(NVARCHAR(100),ERROR_MESSAGE())
RETURN -1
END CATCH
END
在SSMS中使用上面的預存程序範例 :
USE [資料庫名稱]
GO
DECLARE @TbName NVARCHAR(20) = 'Consultants',@SpReturn INT = Null
/*預存程序中若有輸出的參數一定要加 OUT ,否則無法接收*/
EXEC [dbo].[預存程序名稱] @TbName,@SpReturn OUT
PRINT 'Consultants資料表總筆數: ' + CONVERT(NVARCHAR(10),@SpReturn)
SQL語法: 資料表複製
- 只複製結構,不複製資料
SELECT * INTO 新table FROM 舊table WHERE 1=0
- 複製結構也複製資料
SELECT * INTO 新table FROM 舊table
- 指定匯入某欄位的資料至新的資料表
SELECT a,b,c INTO 新table FROM 舊table
- 將A table某欄位資料複製到B table某欄位
UPDATE B SER B's column= (SELECT a's column FROM A WHERE A's column=B's column)
- 選取B_able某欄位匯入資料至「已存在的A_table」的欄位中
INSERT INTO A_table(A.欄1,A.欄2) SELECT (B.欄1,B.欄2) FROM B_able
預存程序參考 : (忘記從哪取得的但都是網路上參考的)
多多指教!! 歡迎交流!!
你不知道自己不知道,那你會以為你知道