我正在修改一个存储过程来跟踪谁进行了更改。
修改正在进入现场
@summary varchar(max)
。
ALTER Procedure [dbo].[spVndr_UpdateRecord]
( @nVID Int = Null,
@sVendorName Char(50) = Null,
@nVendorType Int = Null,
@sAltName Char(50) = Null,
@sTaxIDSSN Char(20) = Null,
@sAddress Char(30) = Null,
@sAddress2 Char(30) = Null,
@sCity Char(20) = Null,
@sSt Char(2) = Null,
@sZip Char(10) = Null,
@sAreaCode Char(10) = Null,
@sPhoneNum Char(10) = Null,
@sExt Char(3) = Null,
@sEmail Char(50) = Null,
@sFax Char(15) = Null,
@sOldID Char(20) = Null,
@sLicenseNum Char(20) = Null,
@sMedicareID Char(20) = Null,
@sOtherID Char(20) = Null,
@sMisc1 Char(20) = Null,
@sMisc2 Char(20) = Null,
@sMisc3 Char(20) = Null,
@sMisc4 Char(20) = Null,
@sWebPage Char(50) = Null,
@sComments Char(255) = Null,
@sEntryID INT = Null,
@sUserLogin varchar(100) = ''
) AS
DECLARE @VenTyp AS varchar(20), @oVendorName varchar(50), @oTaxIDSSN varchar(50),
@oAddress varchar(50), @oCity varchar(50), @oSt varchar(50), @oZip varchar(50),
@oAreaCode varchar(50), @oPhoneNum varchar(50), @oEmail varchar(50),
@oLicenseNum varchar(50), @oMedicareID varchar(50), @oWebPage varchar(50);
SELECT @VenTyp = VendorType
FROM dbo.VendorType
WHERE idVendorType = @nVendorType
UPDATE
dbo.Vendor
SET
@oVendorName=RTRIM(ISNULL(VendorName, ' ')),
VendorName = RTRIM(@sVendorName),
VenTyp = @VenTyp,
idVendorType = @nVendorType,
AltName = RTRIM(@sAltName),
@oTaxIDSSN=RTRIM(ISNULL(TaxIDSSN, ' ')),
TaxIDSSN = RTRIM(@sTaxIDSSN),
@oAddress=RTRIM(ISNULL(Address, ' ')),
Address = RTRIM(@sAddress),
Address2 = RTRIM(@sAddress2),
@oCity=RTRIM(ISNULL(City, ' ')),
City = RTRIM(@sCity),
@oSt=RTRIM(ISNULL(St, ' ')),
St = @sSt,
@oZip=RTRIM(ISNULL(Zip, ' ')),
Zip = @sZip,
@oAreaCode=RTRIM(ISNULL(AreaCode, ' ')),
AreaCode = @sAreaCode,
@oPhoneNum=RTRIM(ISNULL(PhoneNum, ' ')),
PhoneNum = @sPhoneNum,
Ext = @sExt,
@oEmail=RTRIM(ISNULL(Email, ' ')),
Email = RTRIM(@sEmail),
Fax = @sFax,
OldID = RTRIM(@sOldID),
@oLicenseNum=RTRIM(ISNULL(LicenceNum, ' ')),
LicenceNum = RTRIM(@sLicenseNum),
@oMedicareID=RTRIM(ISNULL(MedicareID, ' ')),
MedicareID = RTRIM(@sMedicareID),
OtherID = RTRIM(@sOtherID),
Misc1 = RTRIM(@sMisc1),
Misc2 = RTRIM(@sMisc2),
Misc3 = RTRIM(@sMisc3),
Misc4 = RTRIM(@sMisc4),
@oWebPage=RTRIM(ISNULL(WebPage, ' ')),
WebPage = RTRIM(@sWebPage),
Comments = RTRIM(@sComments),
EntryID = CAST(@sEntryID AS CHAR(3))
WHERE idVendor = @nVID
DECLARE @summary varchar(max) =
'spVndr_UpdateRecord: ' +
'Vendor(idVendor=[' + LTRIM(ISNULL(@nVID, ' ')) + ']) ' +
CASE WHEN @oVendorName<>@sVendorName
THEN 'VendorName: (old: [' + @oVendorName + ']; new: [' + RTRIM(ISNULL(@sVendorName, ' ')) + ']); ' END +
CASE WHEN @oTaxIDSSN<>@sTaxIDSSN
THEN 'TaxIDSSN: (old: [' + RTRIM(@oTaxIDSSN) + ']; new: [' + RTRIM(ISNULL(@sTaxIDSSN, ' ')) + ']); ' END +
CASE WHEN @oAddress<>@sAddress
THEN 'Address: (old: [' + RTRIM(@oAddress) + ']; new: [' + RTRIM(ISNULL(@sAddress, ' ')) + ']); ' END +
CASE WHEN @oCity<>@sCity
THEN 'City: (old: [' + RTRIM(@oCity) + ']; new: [' + RTRIM(ISNULL(@sCity, ' ')) + ']); ' END +
CASE WHEN @oSt<>@sSt
THEN 'State: (old: [' + RTRIM(@oSt) + ']; new: [' + RTRIM(ISNULL(@sSt, ' ')) + ']); ' END +
CASE WHEN @oZip<>@sZip
THEN 'Zip: (old: [' + RTRIM(@oZip) + ']; new: [' + RTRIM(ISNULL(@sZip, ' ')) + ']); ' END +
CASE WHEN @oAreaCode<>@sAreaCode
THEN 'AreaCode: (old: [' + RTRIM(@oAreaCode) + ']; new: [' + RTRIM(ISNULL(@sAreaCode, ' ')) + ']); ' END +
CASE WHEN @oPhoneNum<>@sPhoneNum
THEN 'PhoneNum: (old: [' + RTRIM(@oPhoneNum) + ']; new: [' + RTRIM(ISNULL(@sPhoneNum, ' ')) + ']); ' END +
CASE WHEN @oEmail<>@sEmail
THEN 'Email: (old: [' + RTRIM(@oEmail) + ']; new: [' + RTRIM(ISNULL(@sEmail, ' ')) + ']); ' END +
CASE WHEN @oLicenseNum<>@sLicenseNum
THEN 'LicenseNum: (old: [' + RTRIM(@oLicenseNum) + ']; new: [' + RTRIM(ISNULL(@sLicenseNum, ' ')) + ']); ' END +
CASE WHEN @oMedicareID<>@sMedicareID
THEN 'MedicareID: (old: [' + RTRIM(@oMedicareID) + ']; new: [' + RTRIM(ISNULL(@sMedicareID, ' ')) + ']); ' END +
CASE WHEN @oWebPage<>@sWebPage
THEN 'WebPage: (old: [' + RTRIM(@oWebPage) + ']; new: [' + RTRIM(ISNULL(@sWebPage, ' ')) + ']); ' END +
' ';
-- Log event
INSERT INTO dbo.[History]
(
[UserID],
[Time],
[Reason]
)
VALUES
(
@sUserLogin,
GETDATE(),
@summary
)
很长。我很抱歉,但问题在于
@summary
值。
我正在测试传入的各种空值。当我构建
@summary
时,我将所有值转换为字符串。
在某个地方,我写的内容插入了一个
NULL
值,导致整个字符串为空。
我不断收到此错误,但我看不到它来自哪里:
无法将 NULL 值插入到表“dbo.History”的“Reason”列中;列不允许为空。插入失败。
我知道如果我尝试将 NULL 值附加到字符串中,它会将整个字符串变为 NULL,但看起来我涵盖了所有可能的情况。
提前致谢。
这与
NULL
值的处理有关。请记住:NULL
NOT 意味着空/缺失。这意味着你不知道。这会导致两个常见的混淆点,两者都可能在这里发挥作用:
NULL
字符串与另一个字符串连接时,结果可能会令人惊讶。具体来说,结果是 NOT 另一个字符串,就好像 NULL
只是一个空字符串。请记住,NULL
意味着您不知道该值,这意味着您也不知道串联操作的结果...因此串联结果是也是NULL
。NULL
作为比较表达式的一个操作数时,结果可能会令人惊讶。具体来说,无论运算符 (=
,<>
, >
, <
, >=
, <=
),将任何值与意味着您不知道的值进行比较的结果都是你还是不知道。当这么多被视为完整的布尔结果时,它被视为错误。