Помощь с командой SQL не работает

#sql #vb.net #tsql #ado.net #sqlcommand

#sql #vb.net #tsql #ado.net #sqlcommand

Вопрос:

У меня есть команда 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 profiler, и вот результат, который фактически генерирует этот запрос.

 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. «

Есть идеи?

Комментарии:

1. У меня есть несбыточные мечты, или я буду --4 = Voided... обрабатывать остальную часть строки как комментарий, оставляя вам только команду SET?

2. @BradChristie: Сделайте это ответом!

Ответ №1:

Полагаю, я сделаю это ответом, но также хотел убедиться, что я был точен (учитывая, как долго я уже встал: grin:).

Из того, что я вижу (и это, вероятно, связано с сокращением вашего оператора, чтобы сделать его однострочным в файле кода), у вас есть объявление комментария в середине вашего оператора:

 --4 = Voided [...]
  

Происходит то, что вы выполняете только свои команды DECLARE и first SET (которые выполняются без ошибок), но остальная часть вашего оператора игнорируется, поскольку она следует за объявлением комментария ( -- ) .

Убедитесь, что при сжатии запроса вы удаляете строки с комментариями. Как только они находятся в одной строке, SQL не заботится и БУДЕТ игнорировать все, что за -- .

Комментарии:

1. Боже, каким идиотом я себя чувствую… Это было все. Я думаю, что я сам слишком долго. лол, я перепробовал все, что мог придумать, и ничего не добился. Каждый раз, когда я бы отлаживал ее в анализаторе запросов, я бы форматировал все, тем самым устраняя проблему. Извините, 2 потратили ваше время впустую.

2. @MaximGershkovich: Не беспокойтесь, у всех нас есть ладони после долгих сеансов кодирования. 😉