带有 varbinary 参数的存储过程中的更新语句

问题描述

我有下表:

CREATE TABLE NZQA_Unit(
    NZQAUnitID                          int IDENTITY(1,1) PRIMARY KEY NOT NULL,NZQAUnitNumber                      int NOT NULL,Title                               nvarchar(255) NOT NULL,Level                               smallint NOT NULL,Credits                             smallint NOT NULL,Classification                      nvarchar(255) NULL,AvailableGrade                      int NULL DEFAULT 1,Purpose                             nvarchar(max) NULL,Validity                            int NOT NULL DEFAULT 1,-- by default the unit will be 'Current'
    Document                            VARBINARY(MAX) NULL,-- for being able to upload a PDF or Word document
    DocumentExtension                   varchar(5) NULL,-- for storing the file extension
    CONSTRAINT AK_NZQA_Unit_Title           UNIQUE(Title),CONSTRAINT AK_NZQA_Unit_Number          UNIQUE(NZQAUnitNumber),CONSTRAINT FK_NZQA_Unit_Validity        FOREIGN KEY (Validity) REFERENCES NZQA_Unit_Validity (ValidityID),CONSTRAINT FK_NZQA_Unit_AvailableGrade  FOREIGN KEY (AvailableGrade) REFERENCES NZQA_Unit_Assessment_Grade (AssessmentGradeID),CONSTRAINT CK_NZQA_Unit_Title           CHECK ((len(ltrim(rtrim(Title)))>(2))),CONSTRAINT CK_NZQA_Unit_ID_Range        CHECK (NZQAUnitNumber >= 1000 AND NZQAUnitNumber <= 99999),--Inclusive
    CONSTRAINT CK_NZQA_Unit_Level           CHECK (Level >= 1 AND Level <= 10),-- Level must be between 1 and 10 https://www.nzqa.govt.nz/studying-in-new-zealand/understand-nz-quals/
    CONSTRAINT CK_NZQA_Unit_Credits         CHECK (Credits >= 1 AND Credits <= 999),-- 999 has been set arbitrarily but it's high enough to fit an Engineering Degree
    CONSTRAINT CK_NZQA_Unit_DocumentSize    CHECK (DATALENGTH(Document) <= 524288),-- Maximum size 500 KB https://stackoverflow.com/questions/34741079/can-i-set-2-mb-for-maximum-size-of-varbinary      https://www.gbmb.org/mb-to-bytes
    CONSTRAINT CK_NZQA_Unit_DocumentExtension   CHECK (DocumentExtension IN ('.pdf','.doc','.docx')) -- this check is not case sensitive,i.e. '.DOCX' won't trigger an error
    );
GO

我正在编写以下存储过程:

DROP PROCEDURE  IF EXISTS  Modify_NZQA_Unit
GO

CREATE PROCEDURE Modify_NZQA_Unit
    @NZQAUnitID                 int,@NZQAUnitNumber             int,@Title                      nvarchar(255),@Level                      smallint,@Credits                    smallint,@Classification             nvarchar(255) NULL,@AvailableGrade             int,@Purpose                    nvarchar(max),@Validity                   int,@Document                   VARBINARY(MAX),@DocumentExtension          varchar(5),@overwriteFile              bit -- 1 to overwrite,0 to no overwrite
AS
BEGIN
    IF (@NZQAUnitID IS NULL)
    BEGIN
        THROW 51006,'You must input the NZQA identifier (NZQAUnitID)',1;  
    END
    
    SET @Title = Replace(@Title,'''','''''') -- singles quotes must be escaped
    SET @Classification = Replace(@Classification,'''''')
    SET @Purpose = Replace(@Purpose,'''''')
    SET @DocumentExtension = Replace(@DocumentExtension,'''''')

    DECLARE @updateStatement AS NVARCHAR(1000);
    SET @updateStatement = 'UPDATE NZQA_Unit SET NZQAUnitNumber = '+CONVERT(VARCHAR,@NZQAUnitNumber)+',Title = '''+@Title+''',Level = '+CONVERT(VARCHAR,@Level)+',Credits = '+CONVERT(VARCHAR,@Credits)+',Classification = '''+@Classification+''',AvailableGrade = '+CONVERT(VARCHAR,@AvailableGrade)+',Purpose = '''+@Purpose+''',Validity = '+CONVERT(VARCHAR,@Validity)
    
    IF (@overwriteFile IS NULL) 
    BEGIN
        THROW 51007,'Variable @overwriteFile cannot be null',1;  
    END
    ELSE
    BEGIN
        IF (@overwriteFile = 1)
        BEGIN
            IF (@Document IS NULL)
            BEGIN
                THROW 51008,'If the variable @overwriteFile is set to 1,a file (@Document) must be provided',1;  
            END 
            IF (@DocumentExtension IS NULL)
            BEGIN
                THROW 51009,the document extension (@DocumentExtension) must be provided',1;     
            END 

            SET @updateStatement = @updateStatement + ',Document = '+'HERE WILL COME THE VARBINARY'+',DocumentExtension = '''+@DocumentExtension + ''' '

            --DOESN'T WORK: EXEC('UPDATE NZQA_Unit SET NZQAUnitNumber = '+@NZQAUnitNumber+',Level = '+@Level+',Credits = '+@Credits+',AvailableGrade = '+@AvailableGrade+',Validity = '+@Validity + ',Document = ' + @document + ',DocumentExtension = '''+@DocumentExtension + ''' ' +' WHERE NZQAUnitID = '+@NZQAUnitID)
            UPDATE NZQA_Unit SET NZQAUnitNumber = @NZQAUnitNumber,Title = @Title,Level = @Level,Credits = @Credits,Classification = @Classification,AvailableGrade = @AvailableGrade,Purpose = @Purpose,Validity = @Validity,Document = @document,DocumentExtension = @DocumentExtension WHERE NZQAUnitID = @NZQAUnitID
        END
        ELSE
        BEGIN
            UPDATE NZQA_Unit SET NZQAUnitNumber = @NZQAUnitNumber,Validity = @Validity WHERE NZQAUnitID = @NZQAUnitID
        END
    END

    SET @updateStatement = @updateStatement +' WHERE NZQAUnitID = '+CONVERT(VARCHAR,@NZQAUnitID)
    PRINT @updateStatement  
END
GO

如何将 varbinary 数据 (@Document) 插入到 @updateStatement 变量中?这样我就可以简单地做一个 EXEC(@updateStatement)?

执行以下程序的代码:

DECLARE @current    AS INT = 1
DECLARE @expiring   AS INT = 2
DECLARE @expired    AS INT = 3
DECLARE @achieved   AS INT = 1
DECLARE @datos      AS VARBINARY(30) = CONVERT(varbinary(30),N'this IS a test')
INSERT NZQA_Unit (NZQAUnitNumber,[Title],[Level],[Credits],[Classification],[AvailableGrade],[Purpose],Validity) VALUES (6401,N'Provide first aid',2,1,N'Health Studies > First Aid',@achieved,N'People credited with this unit standard are able to provide first aid.',@current)

EXEC Modify_NZQA_Unit 1,6424,@current,@datos,'.pdf',1

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...