代码之家  ›  专栏  ›  技术社区  ›  madlan

二进制文件upsert的可选SQL参数

  •  1
  • madlan  · 技术社区  · 14 年前

    sqlCommand.CommandText = "EXEC sp_UPSERT_MYFILETABLE @Customer_ID,  @MyFile"
    

    sqlCommand.Parameters.Add(New SqlParameter("@MyFile", SqlDbType.VarBinary)).Value = File.ReadAllBytes(MyFileLocation)
    

    sqlCommand.Parameters.Add(New SqlParameter("@MyFile", SqlDbType.VarBinary)).Value = DBNull.Value
    

    @id int,
    @MyFile varbinary(MAX),
    @Customer_ID int,
    @Username varchar(30),
    @Password varchar(30),
    @AnotherValue varchar(30)
    
    AS
    BEGIN
    MERGE INTO dbo.Remote_Access_Details AS target 
    USING (
           VALUES (@id
                    ,@Customer_ID
                    ,@Username
                    ,@Password
                    ,@AnotherValue)
    
          )  AS source (id
                    ,Customer_ID
                    ,Username
                    ,Password
                    ,AnotherValue)
    
       ON target.Customer_ID = source.Customer_ID
    WHEN MATCHED 
       THEN UPDATE 
                    SET id= source.id
                    ,Username= source.Username
                    ,Password = source.Password
                    ,AnotherValue = source.AnotherValue
    
    WHEN NOT MATCHED 
       THEN INSERT (Id
                    ,Username
                    ,Password
                    ,AnotherValue) 
               VALUES (Id
                    ,Username
                    ,Password
                    ,AnotherValue);
    
    END
    RETURN
    

    1 回复  |  直到 14 年前
        1
  •  1
  •   8kb    14 年前

    您可以添加一个位标志作为参数,然后在case语句中使用它来确定该过程应该进行自我更新还是使用新值。

    CREATE PROCEDURE [sp_UPSERT_MYFILEPROC] 
    
    @MyFile varbinary(MAX), 
    @Customer_ID int,
    @UpdateFile bit = 0
    
    AS 
    BEGIN 
    
    MERGE INTO dbo.Remote_Access_Details AS target  
    USING ( 
           SELECT @MyFile,
                  @Customer_ID,
                  @UpdateFile
          )  AS source (MyFile, Customer_ID, UpdateFile) 
       ON target.Customer_ID = source.Customer_ID 
    WHEN MATCHED
       THEN UPDATE  
          SET MyFile = CASE WHEN @UpdateFile = 1 
                            THEN source.MyFile 
                            ELSE target.MyFile END
    WHEN NOT MATCHED  
       THEN INSERT (MyFile)  
               VALUES (MyFile) 
    ;
    
    RETURN
    END