簡體   English   中英

儲存程序

[英]Stored Procedure

你能幫我嗎。 我有這個字符串插入到名為tblApplication的表中

 insert into tblApplication (ApplicationID,ControlNo,Name)
 values 
 (@AppID,Name);

我希望如果我將其插入tblApplication,則存儲過程將為插入的應用程序生成一個控制號。

控制編號的格式類似於18-0001年,並且根據特定年份的申請號生成的編號

select Concat( ( YEAR( GETDATE() ) % 100 ),'-', ( select count(AppicationID) + 
1 from tblApplication where year(TransactionDate) = year(getDate()) + 1 ) )

我的存儲過程就是這樣,並基於我如何理解Google中的存儲過程,但我對此不確定

CREATE PROCEDURE GenerateControlNumberForInsertedApplication
    @ApplicationID Varchar(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE tblApplication set ControlNo = @ApplicationID
END

按照我的想法,您的應用程序表如下所示

表格:tblApplication團體:ApplicationID,ControlNo,Name,TransactionDate

因此,當您插入時,僅插入ApplicationId,Name。 (我希望應用程序ID是唯一的)

  1. 您的插入語句應如下所示

      INSERT INTO tblApplication (ApplicationId , Name) Values (@AppID,@Name) 
  2. 創建觸發器

      CREATE TRIGGER trgAfterInsert on tblApplication FOR INSERT BEGIN DECLARE @ControlNumber NVARCHAR(50) DECLARE @AppId INT select @ControlNumber = Concat( ( YEAR( GETDATE() ) % 100 ),'-', ( select count(AppicationID) + 1 from tblApplication where year(TransactionDate) = year(getDate()) + 1 ) ) Select @AppId = ApplicationId from inserted Update tblApplication SET ControlNumber = @ControlNumber where ApplicationId = @AppId 

    結束

我只想提及另一種方法。 由於您要計算ApplicationID的數量,因此在結果中加1。 我有一些對您的情況有用的方法。

  1. 使用標量函數生成控制編號
  2. 使用序列生成控制編號
  3. 在tblApplication中使用計算列
  4. 在tblApplication中使用IDENTITY
  5. 使用帶有生成的控制編號的視圖。

有關更多說明,如果您使用標量函數來生成控制編號,那么您將具有在不比存儲過程更具靈活性的情況下使用通用函數的優勢。 此方法可以與對行進行計數並將結果加1的相同方法一起使用,也可以添加標識列以使事情由SQL Server自動化和控制。 另一種方法是使用標量函數+標識列添加計算列,這將為您提供保存控制編號的列,而無需進行轉換和執行額外的步驟。

因此,標量函數是類似於YEAR(),COUNT()。etc等函數的函數。 您只需要設置它,它將在您使用它的任何地方為您提供輸出。 (有點像Java C#中的方法和Javascript中的函數,但有SQL限制)。

要創建標量函數,可以執行以下操作:

CREATE FUNCTION FN_ControlNumber()
RETURNS VARCHAR(100)
AS
BEGIN

    DECLARE
        @Result         VARCHAR(100)
    ,   @ApplicationId  INT 

SET @ApplicationId = (SELECT COUNT(ApplicationId) + 1 FROM tblApplication WHERE YEAR(TransactionDate) =  YEAR(GETDATE()) + 1)

SET 
    @Result = CAST(YEAR(GETDATE()) % 100  AS VARCHAR(2) ) + '-' + CAST(@ApplicationId + 1 AS VARCHAR(97))

    RETURN @Result

END

然后稱之為:

SELECT dbo.FN_ControlNumber()

結果將是新的控制號,因此您可以從C#(使用executeScalar),存儲過程,觸發器,視圖或任何要生成新控制號的地方調用它。

如果您想要其他方法,可以使用如下視圖:

CREATE VIEW tblApplication_ControlNumber
AS
SELECT 
    CAST(YEAR(GETDATE()) % 100  AS VARCHAR(2) ) + '-' + CAST(ControlNumber + 1 AS VARCHAR(97)) AS ControlNumber
FROM (
SELECT 
    COUNT(ApplicationId) + 1 AS ControlNumber 
FROM 
        tblApplication 
WHERE 
    YEAR(TransactionDate) =  YEAR(GETDATE()) + 1 
) D 

與函數輸出類似,但是您需要這樣調用它:

SELECT ControlNumber FROM tblApplication_ControlNumber

如果您需要全局使用順序編號(與其他表一起使用),甚至只與一個表一起使用,在這里都無所謂。 想法是,序列類似於IDENTITY,但與表並不緊密。 因此,您可以在一張或多張桌子上使用它。 如果您擁有創建一個特權的權限,那么我建議您使用它,是否比確定身份更有效。

我的建議是添加一個IDENTITY列以使由DBMS進行順序控制並將其設置為PRIMARY KEY,然后使用標量函數以IDENTITY列作為輸入來生成控制號並將其用於計算列中。 這將為每個插入自動計算。 因此,無需存儲過程,就不需要觸發器。 如果以某種方式更改了控制編號格式,則只需從函數中更改格式,計算列內所有生成的控制編號將自動更新。

如果您願意接受我的建議,那么您的功能將如下所示:

CREATE FUNCTION FN_GenerateSequence
(
    @ID     INT
)
RETURNS VARCHAR(100)
AS
BEGIN

    DECLARE
        @Result         VARCHAR(100)


SET 
    @Result = CAST(YEAR(GETDATE()) % 100  AS VARCHAR(2) ) + '-' + CAST(@ApplicationId AS VARCHAR(97))


    RETURN @Result

END

然后,您可以使用INT類型的任何列來調用它,如下所示:

SELECT dbo.FN_GenerateSequence(ID)

如果要與計算列一起使用,只需使用以下命令:

dbo.FN_GenerateSequence(ComputedColumnName)

這是一些有用的方法,我剛剛提到它們是為了給您另一種觀點,並且可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM