我正在使用存储过程使用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)
答案 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