将数据插入sql表并获取最近插入的ID并将不同表中的数据插入同一表中

时间:2021-01-15 14:49:06

标签: sql-server

这里是我必须在 SQL 表中插入个人资料照片的情况。但这里有两种情况

  1. 如果用户从前端插入照片和数据。它工作得很好。

  2. 如果用户跳过照片而只是插入他的传记,那么在这种情况下,默认情况下应插入默认图像。我试图在前端做只是在 if else 条件下添加虚拟图像,但是在 DMZ 服务器中由于某种原因这会产生问题,在本地服务器上它运行良好。 这是查询...

       ALTER PROCEDURE [dbo].[SavePhysicianBiodata]
      -- Add the parameters for the stored procedure here
      @ID int,
       @Physician_Bio nvarchar(MAX),
      @Physician_Mnemonic nvarchar(MAX),
      @Physician_Image image,
      @Physician_ImageType nvarchar(MAX),
      @Physician_ImageFileName nvarchar(MAX)
     AS
     BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    if( @ID is null OR @ID='')
     begin
    
                 --if not image then deafult image will be applied
             if((@Physician_ImageType is null or @Physician_ImageType='') and 
          (@Physician_ImageFileName is null or @Physician_ImageFileName='') )
                 begin
                         insert into Physician_Biodata(Physician_Bio, Physician_Mnemonic)
                         values(@Physician_Bio, @Physician_Mnemonic)
    
         set @ID = SCOPE_IDENTITY()
                                 update [dbo].[Physician_Biodata]
                                 set Physician_Image=@Physician_Image,
                                 Physician_ImageType=@Physician_ImageType,
                                 Physician_ImageFileName=@Physician_ImageFileName
                                 where ID=@ID
                         end
             else
                     begin
                         -- Insert statements for procedure here when user adds photo as well
                         insert into Physician_Biodata(Physician_Bio, Physician_Mnemonic, 
                        Physician_Image, Physician_ImageType, Physician_ImageFileName)
                         values(@Physician_Bio, @Physician_Mnemonic, 
                     @Physician_Image,@Physician_ImageType,@Physician_ImageFileName)
                     end
    
                end
             else
                 begin
                         update [dbo].[Physician_Biodata]
                         set Physician_Bio=@Physician_Bio,
                         Physician_Mnemonic=@Physician_Mnemonic,
                         Physician_Image=@Physician_Image,
                         Physician_ImageType=@Physician_ImageType,
                         Physician_ImageFileName=@Physician_ImageFileName
                 where ID=@ID
                 end
    
                END
    

在这个查询中,我还尝试了下面给出的插入查询

                                    insert into Physician_Biodata(ID, Physician_Image, Physician_ImageType, Physician_ImageFileName)
                                select @ID, dd.Physician_Image,dd.Physician_ImageType,dd.Physician_ImageFileName from DefaultImage as dd
                                join Physician_Biodata
                                on Physician_Biodata.Physician_ImageFileName = dd.Physician_ImageFileName
                                where Physician_Biodata.ID = @ID

但在执行过程中出错

Msg 544, Level 16, State 1, Procedure dbo.SavePhysicianBiodata, Line 35 [Batch Start Line 2]
Cannot insert explicit value for identity column in table 'Physician_Biodata' when IDENTITY_INSERT is set to OFF.

如果有人可以帮助我,那就太好了.. 提前致谢。

2 个答案:

答案 0 :(得分:0)

看起来Physician_BiodataID 列是一个IDENTITY,因此您有例外。

改变这个...

INSERT INTO Physician_Biodata (
    ID, Physician_Image, Physician_ImageType, Physician_ImageFileName
)
SELECT 
    @ID,
    dd.Physician_Image,
    dd.Physician_ImageType,
    dd.Physician_ImageFileName 
FROM DefaultImage AS dd
JOIN Physician_Biodata
    ON Physician_Biodata.Physician_ImageFileName = dd.Physician_ImageFileName
WHERE 
    Physician_Biodata.ID = @ID;

为此...

INSERT INTO Physician_Biodata (
    Physician_Image, Physician_ImageType, Physician_ImageFileName
)
SELECT 
    dd.Physician_Image,
    dd.Physician_ImageType,
    dd.Physician_ImageFileName 
FROM DefaultImage AS dd
JOIN Physician_Biodata
    ON Physician_Biodata.Physician_ImageFileName = dd.Physician_ImageFileName
WHERE 
    Physician_Biodata.ID = @ID;

会使您的“显式值”异常消失,就像在您尝试将 INSERT 插入 @IDID 中一样,这是一个标识列。您还在 ID = @ID 子句中使用了 WHERE,这使得插入 @ID 毫无意义,因为这将是一个先有鸡还是先有蛋的问题。

另一方面,如果 @Physician_ImageType@Physician_ImageFileName 都进入 NULL,鉴于您现有的 SP 的逻辑,它们在您的 UPDATE 中仍然为 NULL。

我冒昧地整理/简化了您的 T-SQL,并添加了关于我所质疑的内容的注释。

ALTER PROCEDURE [dbo].[SavePhysicianBiodata] (
    @ID int,
    @Physician_Bio nvarchar(MAX),
    @Physician_Mnemonic nvarchar(MAX),
    @Physician_Image image,
    @Physician_ImageType nvarchar(MAX),
    @Physician_ImageFileName nvarchar(MAX)
)
AS
BEGIN

    SET NOCOUNT ON;

    IF ISNULL( @ID, '' ) = ''
    BEGIN

        --if not image then deafult image will be applied
        IF ISNULL( @Physician_ImageType, '' ) = '' AND ISNULL( @Physician_ImageFileName, '' ) = ''
        BEGIN

            INSERT INTO Physician_Biodata ( Physician_Bio, Physician_Mnemonic )
                VALUES ( @Physician_Bio, @Physician_Mnemonic ) ;
            
            SET @ID = SCOPE_IDENTITY();

            /*
                Where are you setting the values for @Physician_Image, @Physician_ImageType, and @Physician_ImageFileName? These are still NULL?
            */

            UPDATE [dbo].[Physician_Biodata]
            SET
                Physician_Image = @Physician_Image,
                Physician_ImageType = @Physician_ImageType,
                Physician_ImageFileName = @Physician_ImageFileName
            WHERE 
                ID = @ID;
        
        END
        ELSE BEGIN
        
            -- Insert statements for procedure here when user adds photo as well
            INSERT INTO Physician_Biodata (
                Physician_Bio, Physician_Mnemonic, Physician_Image, Physician_ImageType, Physician_ImageFileName
            )
            VALUES (
                @Physician_Bio, @Physician_Mnemonic, @Physician_Image, @Physician_ImageType, @Physician_ImageFileName
            );
        
        END
    
    END
    ELSE BEGIN
    
        UPDATE [dbo].[Physician_Biodata]
        SET
            Physician_Bio = @Physician_Bio,
            Physician_Mnemonic = @Physician_Mnemonic,
            Physician_Image = @Physician_Image,
            Physician_ImageType = @Physician_ImageType,
            Physician_ImageFileName = @Physician_ImageFileName
        WHERE
            ID = @ID;
    
    END

END

答案 1 :(得分:0)

是的,我已经更改了第一个插入语句(删除了 ID)并且 更新了第二个查询

set @ID = IDENT_CURRENT('Physician_Biodata') 
update Physician_Biodata 
set Physician_Biodata.Physician_Image= DefaultImage.Physician_Image, Physician_Biodata.Physician_ImageType= DefaultImage.Physician_ImageType, Physician_Biodata.Physician_ImageFileName=DefaultImage.Physician_ImageFileName from Physician_Biodata, DefaultImage where Physician_Biodata.ID=@ID 

它奏效了

相关问题