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

时间:2010-09-16 00:37:26

标签: sql-server vb.net

我正在使用存储过程使用MERGE更新\插入数据到表中。 插入的项目之一是VarBinary文件。现在,如果我想添加一个新文件,只是如下所示使用ReadAllBytes,删除我传递DBNull的文件。

现在如果其他字段正在更新但文件没有被更改怎么办?我希望该字段保持不变,除非我正在替换文件或删除它如上所述...

我无法再次通过参数添加文件,因为它可能只存在于数据库中,除非我先读取它并将其写回来,这似乎毫无意义。

执行存储过程:

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

存储过程:

创建程序[sp_UPSERT_MYFILEPRO]

@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

这是SQL 2008上的VB.net(VS2008)

1 个答案:

答案 0 :(得分:1)

您可以添加一个位标志作为参数,然后在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