【问题标题】:Return a reject table from a stored procedure从存储过程返回拒绝表
【发布时间】:2021-03-31 13:17:04
【问题描述】:

我希望我的存储过程为我的暂存中的行填充一个“拒绝”表,该行不能注入到我的目标表中(例如,没有描述的行在我的目标中不是 NULL)。

我不知道拒绝表的结构。

如果您需要更多信息,我可以编辑!

有我的表暂存

CREATE TABLE [staging].[B]
(
    [ID] [varchar](250)  NULL,
    [Address] [varchar](250) NULL,
    [Approved] [bit]  NULL,
    [Description] [varchar](1000) NULL;
)

这是我的目标表:

CREATE TABLE [dbo].[A]
(
    [ID] [varchar](250) NOT NULL,
    [Address] [varchar](250) NULL,
    [Approved] [tinyint] NULL,
    [Description] [varchar](1000) NOT NULL;
)

这是我的存储过程代码:

  ALTER PROCEDURE [dbo].[StoredProcedure]
    (
        @processType Varchar(4),
        @stagingTable Varchar(64),
        @destinationTable Varchar(64),
        @errorMessage NVarchar(MAX) = null OUTPUT
    )
AS
BEGIN

   SET NOCOUNT ON;

   DECLARE @isLocaltran BIT = 0

   BEGIN TRY
   
    IF @@TRANCOUNT = 0
    BEGIN
        BEGIN TRANSACTION
        SET @isLocaltran = 1
    END
    DELETE 
    FROM  staging.B
    WHERE staging.B.[Description] IS NULL 
    OUTPUT 
    deleted.* 
    INTO [dbo].[RejectTable]

    MERGE dbo.A AS TARGET
    USING staging.B AS SOURCE ON (TARGET.ID = SOURCE.ID)
       SELECT 
           TARGET.[Address],
           TARGET.[Approved],
           TARGET.[Description]

       EXCEPT

       SELECT  
           SOURCE.[Address],
           SOURCE.[Approved],
           SOURCE.[Description]
                                )
         THEN
            UPDATE 
                SET TARGET.[Address] = SOURCE.[Address],
                    TARGET.[Approved] = SOURCE.[Approved],
                    TARGET.[Description] = SOURCE.[Description] 
               
    WHEN NOT MATCHED 
        THEN
            INSERT (,[ID], [Address], [Approved], [Description])
            VALUES (...)

)

【问题讨论】:

  • 您可以在 proc 中进行 ETL 验证和清理,而不是使用单个 MERGE 语句。例如,DELETE FROM Staging.b WHERE Id IS NULL OR Adddress IS NULL ... OUTPUT deleted.* INTO RejectTable;
  • 另外,@nada,请尽量避免使用“txt 语言”,如“bcz”和“btw”。 Stack Overflow 是一个面向专业人士的编程问答网站,因此我们希望语言写得好,但对于这里的许多用户来说,英语不是他们的第一语言,甚至不是第二或第三语言。因此,他们可能不知道“bcz”是因为,或者“btw”是顺便说一下。谢谢。
  • “我必须为每个对象都有一个被拒绝的表?” 是的,@nada,因为每个表都有(非常)不同的定义。
  • 正如我提到的,不在MERGE 声明中。像我的示例一样使用DELETE 查询删除坏行,并将删除的行输出到拒绝表中。然后执行MERGE语句。
  • @nada,抱歉,我在示例评论中放错了 OUTPUT 子句。应该像DELETE FROM Staging.b OUTPUT deleted.* INTO RejectTable WHERE...

标签: sql-server stored-procedures fault fault-tolerance


【解决方案1】:

非常感谢@Dan Guzman 的评论。这对我帮助很大。

DELETE FROM Staging.b OUTPUT deleted.* INTO RejectTable WHERE..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2011-11-06
    • 2016-04-08
    • 1970-01-01
    • 2016-01-25
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多