【发布时间】:2017-05-08 09:05:42
【问题描述】:
我遇到了一个奇怪的问题, 我的 c# 程序正在向数据库中插入值(基本上检查记录是否存在然后更新它,否则,插入到表中)
存储过程和表的查询如下所示:
表格
CREATE TABLE [dbo].[PurchaseReceiptbySheetOil](
[id] [int] IDENTITY(1,1) NOT NULL,
[LPOId] [int] NULL,
[POLineNumber] [nvarchar](100) NULL,
[Serial] [nvarchar](100) NULL,
[DateLoaded] [date] NULL,
[truck] [nvarchar](100) NULL,
[Trailer] [nvarchar](100) NULL,
[Transporter] [nvarchar](100) NULL,
[Driver] [nvarchar](max) NULL,
[PassportNumber] [nvarchar](100) NULL,
[ObserverdVolume] [nvarchar](100) NULL,
[Terminal] [nvarchar](100) NULL,
[Tank] [nvarchar](100) NULL,
[TempInTank] [nvarchar](100) NULL,
[VCF20] [float] NULL,
[VolumeLTS20C] [float] NULL,
[Density20C] [float] NULL,
[WeightMTons] [float] NULL,
[Destination] [nvarchar](max) NULL,
[BottomSEALNRS] [nvarchar](max) NULL,
[TopSealNRS] [nvarchar](100) NULL,
[SAMPLESEALNRS] [nvarchar](max) NULL,
[PhysicalDipsOnTheTruckinMM1] [int] NULL,
[PhysicalDipsOnTheTruckinMM2] [int] NULL,
[PhysicalDipsOnTheTruckinMM3] [int] NULL,
[PhysicalDipsOnTheTruckinMM4] [int] NULL,
[PhysicalDipsOnTheTruckinMM5] [int] NULL,
[PhysicalDipsOnTheTruckinMM6] [int] NULL,
[Site] [nvarchar](100) NULL,
[LineNumber] [int] NULL,
[CreatedOn] [datetime] NULL,
[UpdatedOn] [datetime] NULL,
[CreatedBy] [nvarchar](100) NULL,
[UpdatedBy] [nvarchar](100) NULL
)
存储过程
CREATE PROCEDURE [dbo].[CreateUpdatePurchaseReceiptbySheetOil]
@Site nvarchar(100),
@CreatedOn datetime,
@UpdatedOn datetime,
@CreatedBy nvarchar(100),
@UpdatedBy nVarchar(100),
@DateLoaded date,
@truck nvarchar(100),
@Trailer nvarchar(100),
@Transporter nvarchar(100),
@Driver nvarchar(max),
@PassportNumber nvarchar(100),
@ObserverdVolume nvarchar(100),
@Terminal nvarchar(100),
@Tank nvarchar(100),
@TempInTank nvarchar(100),
@VCF20 float,
@VolumeLTS20C float,
@Density20C float,
@WeightMTons float,
@Destination nvarchar(max),
@BottomSEALNRS nvarchar(max),
@SAMPLESEALNRS nvarchar(max),
@PhysicalDipsOnTheTruckinMM1 int,
@PhysicalDipsOnTheTruckinMM2 int,
@PhysicalDipsOnTheTruckinMM3 int,
@PhysicalDipsOnTheTruckinMM4 int,
@PhysicalDipsOnTheTruckinMM5 int,
@PhysicalDipsOnTheTruckinMM6 int,
@Serial Nvarchar(100),
@LineNumber int,
@POLineNumber int,
@TopSealNRS nvarchar(100),
@LPOId nvarchar(100)
AS
BEGIN
if exists(select * from [PurchaseReceiptbySheetOil] where Site= @Site and
Serial=@Serial and LineNumber = @LineNumber)
BEGIN
UPDATE [dbo].[PurchaseReceiptbySheetOil]
SET [DateLoaded] = @DateLoaded,
UpdatedOn =@UpdatedOn,
UpdatedBy=@UpdatedBy,
[truck] = @truck
,[Trailer] = @Trailer
,[Transporter] = @Transporter
,[Driver] = @Driver
,[PassportNumber] = @PassportNumber
,[ObserverdVolume] = @ObserverdVolume
,[Terminal] = @Terminal
,[Tank] = @Tank
,[TempInTank] = @TempInTank
,[VCF20] = @VCF20
,[VolumeLTS20C] = @VolumeLTS20C
,[Density20C] = @Density20C
,[WeightMTons] = @WeightMTons
,[Destination] = @Destination
,[BottomSEALNRS] = @BottomSEALNRS
,[SAMPLESEALNRS] = @SAMPLESEALNRS
,[PhysicalDipsOnTheTruckinMM1] = @PhysicalDipsOnTheTruckinMM1
,[PhysicalDipsOnTheTruckinMM2] = @PhysicalDipsOnTheTruckinMM2
,[PhysicalDipsOnTheTruckinMM3] = @PhysicalDipsOnTheTruckinMM3
,[PhysicalDipsOnTheTruckinMM4] = @PhysicalDipsOnTheTruckinMM4
,[PhysicalDipsOnTheTruckinMM5] = @PhysicalDipsOnTheTruckinMM5
,[PhysicalDipsOnTheTruckinMM6] = @PhysicalDipsOnTheTruckinMM6
,[Serial] = @Serial
,TopSealNRS=@TopSealNRS
,LPOId=@LPOId
WHERE Site= @Site and Serial=@Serial and LineNumber = @LineNumber
END
else
BEGIN
INSERT INTO [dbo].[PurchaseReceiptbySheetOil]
([LPOId]
,[POLineNumber]
,[Serial]
,[DateLoaded]
,[truck]
,[Trailer]
,[Transporter]
,[Driver]
,[PassportNumber]
,[ObserverdVolume]
,[Terminal]
,[Tank]
,[TempInTank]
,[VCF20]
,[VolumeLTS20C]
,[Density20C]
,[WeightMTons]
,[Destination]
,[BottomSEALNRS]
,[TopSealNRS]
,[SAMPLESEALNRS]
,[PhysicalDipsOnTheTruckinMM1]
,[PhysicalDipsOnTheTruckinMM2]
,[PhysicalDipsOnTheTruckinMM3]
,[PhysicalDipsOnTheTruckinMM4]
,[PhysicalDipsOnTheTruckinMM5]
,[PhysicalDipsOnTheTruckinMM6]
,[Site]
,[LineNumber]
,[CreatedOn]
,[UpdatedOn]
,[CreatedBy]
,[UpdatedBy])
VALUES
(@LPOId,@POLineNumber,
@Serial,@DateLoaded,
@truck,@Trailer,@Transporter,@Driver,
@PassportNumber,@ObserverdVolume,@Terminal,@Tank,@TempInTank,
@VCF20,@VolumeLTS20C,@Density20C,@WeightMTons,@Destination,@BottomSEALNRS,
@TopSealNRS,@SAMPLESEALNRS,
@PhysicalDipsOnTheTruckinMM1,@PhysicalDipsOnTheTruckinMM2,
@PhysicalDipsOnTheTruckinMM3,@PhysicalDipsOnTheTruckinMM4,
@PhysicalDipsOnTheTruckinMM5,@PhysicalDipsOnTheTruckinMM6,@Site,
@LineNumber,@CreatedOn,@UpdatedOn,@CreatedBy,@UpdatedBy)
END
END
现在当我运行以下查询来执行存储过程时:
exec sp_executesql N'EXECUTE [dbo].[CreateUpdatePurchaseReceiptbySheetOil]
@Site ,@CreatedOn ,
@UpdatedOn ,@CreatedBy
,@UpdatedBy ,@DateLoaded ,@truck
,@Trailer ,@Transporter ,@Driver
,@PassportNumber ,@ObserverdVolume
,@Terminal ,@Tank ,@TempInTank ,@VCF20
,@VolumeLTS20C ,@Density20C ,@WeightMTons
,@Destination ,@BottomSEALNRS,@TopSealNRS
,@SAMPLESEALNRS ,@PhysicalDipsOnTheTruckinMM1
,@PhysicalDipsOnTheTruckinMM2 ,@PhysicalDipsOnTheTruckinMM3
,@PhysicalDipsOnTheTruckinMM4 ,@PhysicalDipsOnTheTruckinMM5
,@PhysicalDipsOnTheTruckinMM6 ,@Serial ,@LineNumber
,@POLineNumber,@LPOId',N'@CreatedBy nvarchar(7),@CreatedOn datetime,
@UpdatedBY nvarchar(7),@UpdatedOn datetime,@Site nvarchar(7),
@DateLoaded nvarchar(9),@truck nvarchar(7),@Trailer nvarchar(7),
@Transporter nvarchar(5),@Driver nvarchar(8),@PassportNumber nvarchar(8),
@ObserverdVolume nvarchar(6),@Terminal nvarchar(5),@Tank
nvarchar(3),@TempInTank nvarchar(4),
@VCF20 nvarchar(6),@VolumeLTS20C nvarchar(6),@Density20C
nvarchar(6),@WeightMTons nvarchar(6),
@Destination nvarchar(5),@BottomSEALNRS nvarchar(14),@TopSealNRS
nvarchar(33),@SAMPLESEALNRS nvarchar(7),
@PhysicalDipsOnTheTruckinMM1 nvarchar(4),@PhysicalDipsOnTheTruckinMM2
nvarchar(4),@PhysicalDipsOnTheTruckinMM3 nvarchar(4),
@PhysicalDipsOnTheTruckinMM4 nvarchar(4),@PhysicalDipsOnTheTruckinMM5
nvarchar(4),@PhysicalDipsOnTheTruckinMM6 nvarchar(4),
@Serial nvarchar(5),@LineNumber int,@POLineNumber int,@LPOId int',
@CreatedBy=N'Tanveer',
@CreatedOn='2017-05-08 11:50:24.283',
@UpdatedBY=N'Tanveer',
@UpdatedOn='2017-05-08 11:50:24.283',
@Site=N'Site001',
@DateLoaded=N'20-Apr-17',
@truck='',
@Trailer='',
@Transporter=N'00002',
@Driver='',
@PassportNumber=''
@ObserverdVolume=N'40.000',
@Terminal=N'TOTAL',
@Tank=N'223',@TempInTank=N'30.0',@VCF20=N'0.9915',@VolumeLTS20C=N'39.660',
@Density20C=N'0.8219',
@WeightMTons=N'32.597',@Destination=N' DRC ',@BottomSEALNRS=N' 02697558/559
',@TopSealNRS=N' 02697560 TO 562+02697564 TO 566 ',
@SAMPLESEALNRS=N'781845 '
,@PhysicalDipsOnTheTruckinMM1=N'1472',@PhysicalDipsOnTheTruckinMM2=N'1592',
@PhysicalDipsOnTheTruckinMM3=N'1706',@PhysicalDipsOnTheTruckinMM4=N'1832',
@PhysicalDipsOnTheTruckinMM5=N'1808',
@PhysicalDipsOnTheTruckinMM6=N'1362',@Serial=N'00001',@LineNumber=8,
@POLineNumber=0,@LPOId=7
在插入过程中列的值被交换,注意序列的值是 0001,但它会插入为 1362 而不是 0001,对于其他一些列,值也会改变(不是全部)。
-
请注意,我已经检查了插入和 值部分。我正在指定列,但仍然面临这个问题。
-
我已经删除并再次创建了表。
-
在 sql 中调试期间 服务器,调试开始时该值是正确的,即 0001 但随后 变化,我不知道为什么。
【问题讨论】:
-
先生,我认为没有表设计查询或存储过程或执行语句就无法复制它。我尽量保持简洁。
-
SO 不是调试服务。另外,没有鬼。
Serial是一个 IDENTITY 列,因此对于新行它不会从 1 开始。您没有提到任何其他“混合”值的示例。你确定根本有什么问题吗? -
换一种说法——如果有问题,可以用3列表和DML语句复现。你可以吗 ?使用什么架构,什么值?
-
不,删除所有行。仅使用 3 列并实际显示之前和之后的值
标签: sql-server stored-procedures