【问题标题】:Issue in inserting the records using stored procedure with dynamic Id使用具有动态 ID 的存储过程插入记录的问题
【发布时间】:2013-11-07 09:45:11
【问题描述】:

我正在编写一个存储过程来从 TableA 中获取记录列表并将这些记录插入到 TableB 中。现在我面临这个问题。

这是我的sp:

USE [Sample_DB]
GO

SET ANSI_NULLS ON
GOenter code here
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[AddStoredProcedure]

AS
BEGIN

  DECLARE @ProcessedData AS TABLE (Name varchar(200),MaritalStatus varchar(200))     

  INSERT INTO @ProcessedData (Name ,MaritalStatus )
  SELECT Name,MaritalStatus from TableA where MaritalStatus='Male'   


  INSERT INTO [TableB] 
  (
       Id
      ,Name
      ,MaritalStatus        
  )
  SELECT ('M_'+cast(RIGHT(Year(getDate()),2) as varchar)+'_'+cast(REPLACE(STR((select MAX(Id)+1 from [TableA] where MaritalStatus='Male'),4),' ','0') as varchar)),Name,MaritalStatus FROM @ProcessedData 

END  

  TableA contains,

    Id   Name      MaritalStatus
    1    John      Male
    2    Sam       Male
    3    Seema     Female

当我执行存储过程时,AddStoredProcedure

我得到的输出是

 TableB contains,

    Id          Name     MaritalStatus
    M_13_0003      John     Male
    M_13_0003      Sam      Male

但我需要如下;

TableB should be,

Id          Name     MaritalStatus
M_13_0003      John     Male
M_13_0004      Sam      Male

提前感谢大家的回复。

【问题讨论】:

  • 是否有您希望Id 的最后一部分增加的特定顺序?如果 John 是 0004 和 Sam 0003 会有什么不同吗?

标签: mysql sql sql-server stored-procedures


【解决方案1】:

您可以将 row_number 函数用作:

     DECLARE @ProcessedData AS TABLE (Name varchar(200),MaritalStatus varchar(200))     

  INSERT INTO @ProcessedData (Name ,MaritalStatus )
  SELECT Name,MaritalStatus from TableA where MaritalStatus='Male'  

  DECLARE @IdMax int;
  SELECT @IdMax = MAX(Id)
  FROM [TableA] 
  WHERE MaritalStatus='Male';



  INSERT INTO [TableB] 
  (
       Id
      ,Name
      ,MaritalStatus        
  )     
  SELECT ('M_'+cast(RIGHT(Year(getDate()),2) as varchar)+'_'+cast(REPLACE(STR((row_number() over(Order by Name)+@IdMax ),4),' ','0') as varchar)),
  Name,MaritalStatus 
  FROM @ProcessedData 

【讨论】:

    【解决方案2】:
    DECLARE @TableA TABLE (Id INT, Name VARCHAR(20), MaritalStatus VARCHAR(6))
    DECLARE @TableB TABLE (Id VARCHAR(9), Name VARCHAR(20), MaritalStatus VARCHAR(6))
    INSERT INTO @TableA (Id, Name, MaritalStatus) 
    VALUES
    (1, 'John', 'Male'),
    (2, 'Sam', 'Male'),
    (3, 'Seema', 'Female')
    
    
    DECLARE @ProcessedData AS TABLE (Id INT IDENTITY(1,1), Name varchar(200),MaritalStatus varchar(200))     
    
    INSERT INTO @ProcessedData (Name ,MaritalStatus )
    SELECT Name
        ,MaritalStatus 
    FROM @TableA 
    WHERE MaritalStatus='Male'   
    
    
    INSERT INTO @TableB (Id, Name, MaritalStatus)        
    SELECT ('M_'+cast(RIGHT(Year(getDate()),2) as varchar)+'_'+cast(REPLACE(STR((select MAX(Id) from @TableA where MaritalStatus='Male')+Id,4),' ','0') as varchar))
        ,Name
        ,MaritalStatus 
    FROM @ProcessedData 
    
    SELECT * FROM @TableB
    

    我已经用表变量替换了你的表,所以它可以直接运行。 你有什么理由要从0003开始吗?无论如何,此查询都会产生您想要的输出,如果您需要更改,请发表评论。

    【讨论】:

    • 不能评论其他人的答案,但其他答案将适用于您的测试数据,但是如果您将女孩移动为表 A 中的第二个人,则 ID 将在输出(即,如果您将 id1 和 id100 作为男性,将 ids 2-99 作为女性,则在新表中,两条记录的 ID 为 0003 和 0101)。此查询确保新表中的每个 ID 都比上一个大 1。
    猜你喜欢
    • 2011-05-05
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2012-07-28
    相关资源
    最近更新 更多