【发布时间】:2019-12-29 04:58:43
【问题描述】:
我们遇到了存储过程的问题。通过 asp/vb.net 从我们的网站调用它时,它似乎无法正常执行。如果我从 SSMS 运行它,它就可以工作。
我在调用时运行了调试器,在调用 ExecuteNonQuery() 时传入的参数是正确的,但它没有像它应该在相关表中生成任何记录。如果我使用直接在 SSMS 中调试我们的网站时看到的相同值,则存储过程会创建预期的记录。
这是我们的存储过程:
ALTER PROCEDURE [dbo].[CopyGoals](
@OldVisitID int,
@NewVisitID int,
@CreatedBy NVarChar(30)
) AS BEGIN
declare @GoalMapping As Table(OldGoalID int,NewGoalID int);
Merge Into VisitGoals
Using(
select GoalsID,Goal,ProgressNote,Progress,Completed,CreatedOn,CreatedBy,VisitID
From VisitGoals
Where VisitID = @OldVisitID
) As Src
On 1 = 0
When Not Matched By Target Then
Insert (Goal,ProgressNote,Completed,VisitID,Progress, CreatedOn, CreatedBy)
Values (Src.Goal, Src.ProgressNote, Src.Completed, @NewVisitID, Src.Progress, GetDate(), @CreatedBy)
Output Src.GoalsID As OldGoalID, inserted.GoalsID as NewGoalID
Into @GoalMapping;
Insert Into SubGoals(GoalID,VisitID,GoalText,HasCompleted,WillComplete,GoalStatus)
(
Select GM.NewGoalID, @NewVisitID, SG.GoalText, SG.HasCompleted, SG.WillComplete, SG.GoalStatus
From SubGoals As SG inner join @GoalMapping As GM on SG.GoalID = GM.OldGoalID
Where SG.VisitID = @OldVisitID
)
END
这是来自我们网站页面的程序调用:
Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
Dim curUsr As New Supervisor(Context.User.Identity.Name, True)
Using con As New SqlConnection(conStr)
Using cmd As New SqlCommand("CopyGoals", con)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@OldVisitID", SqlDbType.Int).Value = oldVID
cmd.Parameters.Add("@NewVisitID", SqlDbType.Int).Value = newVID
cmd.Parameters.Add("@CreatedBy", SqlDbType.NVarChar, 30).Value = curUsr.Name
con.Open()
cmd.ExecuteNonQuery()
con.Close()
End Using
End Using
这个过程应该做什么,如果从 SSMS 运行的话,是查看我们的目标表,其中现有 ID 与不同表中的 VisitID 对应的外键匹配,以查找与该旧访问关联的所有目标。
它们复制目标信息并将其插入到Goals表中,将旧的目标ID和新插入的目标ID输出到@GoalMapping表中。
然后它会查看我们的子目标表并通过复制与我们刚刚复制的目标相关的每个子目标来执行类似的操作。无论出于何种原因,当从我们的页面调用此过程时,即使它在 SSMS 中运行,当我们向它提供与页面调试期间看到的相同的输入值时,它也无法正确执行。 chrome 的调试器中没有报告错误,我们尝试使用 SQL 和正常异常将执行包装在 try 中,但它们都没有出错。我们很困惑。也许有人会发现我们过去几天没有发现的东西。
这是 Sql Profiler 的输出:
【问题讨论】:
-
您是否尝试过使用与网站相同的用户通过 SSMS 执行存储过程?这可能是权限问题。此外,您可以运行 SQL Profiler,然后运行网站,然后检查网站执行的 T-SQL 查询。
-
首先检查您的连接字符串。如果正确,请检查您的分析器是否执行查询。
-
@NijinKoderi 您好 Nijin,我已经这样做了,但据我所知没有错误。它确实显示了 0 个“写入”,这是否意味着它没有插入找到的(读取为 7 个)记录?
-
@MohsinMehmood 嗨,Mohsin,按照建议做了。 sp 运行并且值在分析器中看起来正确。据我所知,没有错误。我已将探查器跟踪包含在问题的图像中。谢谢。
标签: asp.net sql-server vb.net stored-procedures merge