我试图让用户上传 excel 表以将数据插入 sql 数据库。当他们上传数据时,我想要一个数据网格视图来显示他们刚刚上传到数据库中的数据,并且能够根据日期回顾这些数据。
我创建了一个这样的表:
**dbo.DB_TRACK**
V_ID Identity
TBL_N varchar(20)
ID int
ENTR_DT date
我为其中一个数据库表编写了存储过程,如下所示:
Create Procedure dbo.Insert_Students
(
SName varchar(10),
SAge varchar(10),
SAdmit_Dt varchar(10)
)
Declare @id table(id int),
@pk int,
@iSAge int,
@iSAdmit_Dt date
Set @iSAge=@SAge
Set @iSAdmit_Dt=Convert(Date,@SAdmit_Dt)
BEGIN TRY
BEGIN TRANSACTION
Insert into dbo.Student(Name,Age,AdmissionDt)
OUTPUT INSERTED.S_ID into @id
Values
(@SName,@iSAge,@iSAdmit_Dt)
COMMIT TRANSACTION
BEGIN TRANSACTION
Insert into dbo.DB_TRACK (TBL_N, ID, ENTR_DT )
VALUES ('dbo.Student', (Select @pk=id from @id),GETDATE)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
END CATCH
我收到错误:
“=”附近的语法不正确。
更新:
不再收到此错误(感谢 David Browne)并且能够保存 SP 但在执行 SP 时,我收到此错误:
从字符串转换日期和/或时间时转换失败。
我试过 Convert(date,GetDate()) 但它没有用
调用此存储过程的代码在 VBA 中如下所示:
Dim SName, SAge,SAdmit_DT as String
Dim oSName, oSAge,oSAdmit_DT as ADODB.Parameter
SName= ws.Cells(1, 11)
SAge = ws.Cells(1, 12)
SAdmit_DT = ws.Cells(1, 13)
Set oSName = cmd.CreateParameter("@SName", adVarChar, adParamInput, 10, SName)
cmd.Parameters.Append oSName
Set oSAge = cmd.CreateParameter("@SAge", adVarChar, adParamInput, 10, SAge)
cmd.Parameters.Append oSAge
Set oSAdmit_DT = cmd.CreateParameter("@SAdmit_DT", adVarChar, adParamInput, 10, SAdmit_DT)
cmd.Parameters.Append oSAdmit_DT
cmd.Execute' This is where it errors out
我尝试删除 SAdmit_Dt 但仍然出现错误
我尝试通过 excel 传递 DATE() 但出现算术溢出错误
知道如何解决这个问题吗?还有更好的方法来做我想做的事吗?
- 请不要使用简短、隐蔽的列名。
- 没有理由将单独的语句包装在显式事务中。
您需要在单独的语句中从表变量中提取键值。就像是: