我正在尝试执行SQL命令。
语法如下
Public Shared Function CanRaiseWorkOrder(connection As IDbConnection, ProductID As Guid) As Boolean
Using sqlCmd As IDbCommand = connection.CreateCommand
With sqlCmd
.CommandTimeout = 30
.CommandType = CommandType.Text
.CommandText = "DECLARE @CanRaiseWorkOrder BIT, @WorkOrderQtyCount INT, @ProductAvailCount INT SET @WorkOrderQtyCount = (SELECT SUM(Qty) FROM WorkOrder WHERE ProductID = @ProductID AND WorkOrder.Status <> 4) --4 = Voided SET @ProductAvailCount = (SELECT Qty FROM Product WHERE ProductID = @ProductID) IF @WorkOrderQtyCount < @ProductAvailCount BEGIN SET @CanRaiseWorkOrder = 1 END ELSE BEGIN SET @CanRaiseWorkOrder = 0 END SELECT @CanRaiseWorkOrder AS CanRaiseWorkOrder"
Dim params As New List(Of IDbDataParameter)({
ProductDAL.CreateTSqlParameter("@ProductID", DbType.Guid, ProductID)
})
.Parameters.AddRange(params)
Return .ExecuteScaler(Of Boolean)()
End With
End Using
End Function
您可能会注意到有关于如何创建参数和执行命令的一些自定义,但您可以假设系统的这些方面按要求工作(我们有大量的代码可以正常使用这些方法)。
我可能会让一些人问为什么这不是一个存储过程,答案是“因为我老板这么说”。
我运行了SQL分析器,这是此查询实际生成的输出。
exec sp_executesql N'DECLARE @CanRaiseWorkOrder BIT, @WorkOrderQtyCount INT, @ProductAvailCount INT SET @WorkOrderQtyCount = (SELECT SUM(Qty) FROM WorkOrder WHERE ProductID = @ProductID AND WorkOrder.Status <> 4) --4 = Voided SET @ProductAvailCount = (SELECT Qty FROM Product WHERE ProductID = @ProductID) IF @WorkOrderQtyCount < @ProductAvailCount BEGIN SET @CanRaiseWorkOrder = 1 END ELSE BEGIN SET @CanRaiseWorkOrder = 0 END SELECT @CanRaiseWorkOrder',N'@ProductID uniqueidentifier',@ProductID='0908C780-763F-4CE6-B074-CEC01F4451B4'
在查询分析器中运行代码(当我最初创建它时)工作正常,但如果我运行上面的查询,从SQL命令输出,我得到的只是“Command(s) completed successfully.
”
有什么想法吗?
答案 0 :(得分:1)
图I我会把它作为一个答案,但也想确保我是准确的(考虑到我现在已经多久了:笑:)。
从我所看到的(这可能是因为为了使其成为代码文件中的单行而缩减你的陈述),你在陈述的中间有一个评论声明:
--4 = Voided [...]
正在发生的事情是你只执行你的DECLARE和第一个 SET命令(这些命令没有错误),但你的语句的其余部分被忽略,因为它遵循注释声明({{1 }})。
确保您是否确实压缩了删除注释行的查询。一旦他们在一条线上,SQL就不关心并且会忽略--
之后的任何事情。