Несколько хранимых процедур для значений sql server взаимозаменяемы

#sql #sql-server-2008

#sql #sql-server-2008

Вопрос:

Моя служба развернута на нескольких IIS, и они выполняют значительное количество экземпляров (100-200) 3-4 различных хранимых процедур одновременно. SPS выполняются через «executescalar».

Все SP возвращают разные типы значений. Я понял, что значения были заменены для вызовов SP, которые выполняются одновременно. Я уверен в этом, потому что я получил недопустимое исключение приведения для всех вызовов, и ведение журнала SP было правильным.

Кто-нибудь может сказать мне, что пошло не так!!!

-Спасибо

 CREATE PROCEDURE [DBO].[SPO_DATABASESERVER_GET_CONTEXT_FROMNWACCOUNTID_1.0.5]
            @NwAccountId      BIGINT  = NULL,              
            @ActionFlag VARCHAR(20) = 'NONE'      
AS

BEGIN    
DECLARE @DBID BIGINT
DECLARE @ConnectionString VARCHAR(250)    

IF COALESCE(@NWACCOUNTID,'') != ''                                      
    BEGIN           
      SELECT @DBID = DATABASEID
      FROM   NWACCOUNTMASTER
      WHERE  NWACCOUNTMASTERID = @NWACCOUNTID                                     
    END

 IF (COALESCE(@DBID,'') = '')
    BEGIN 
        RAISERROR ('No DB is assigned for NwAccountId %I64d.',16,1,@NwAccountId)
        RETURN 
    END

  IF EXISTS (SELECT 'X'
         FROM   ACDATABASESERVER
         WHERE  DATABASEID = @DBID)
  BEGIN
      SELECT
           @ConnectionString = CONNECTIONSTRING
      FROM   ACDATABASESERVER
      WHERE  DATABASEID = @DBID
  END

  IF (COALESCE(@ConnectionString,'') = '')
  BEGIN 
        RAISERROR ('SP failed to fetch ConnectionString for NwAccountId %I64d.',16,1,@NwAccountId)
        RETURN 
  END

SELECT @ConnectionString AS CONNECTIONSTRING
END
  

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

1. Я думаю, нам нужно посмотреть код в SPS, который не работает сам по себе

2. там есть код для одного проблемного SP. Второе выполнение представляет собой строку запроса. Формат(«выберите networkId из acgroup, где groupId ={0}», p_nGroupId); за ним следует object nNetworkId = oSqlFramework. GetScalarData(sql); … Там значения были заменены. Запрос возвращает значение int, в то время как приведенный выше SP возвращает строку. но они взаимозаменяемы и вызывают недопустимые исключения приведения.

3. Вы все еще не объяснили, что происходит не так… сколько хранимых процедур? Сколько способов вызова SQL? выберите networkId из acgroup, где groupId ={0} не является сохраненной процедурой.

4. Существует несколько хранимых процедур (3-4, но в разных стеках приложений), которые могут выполняться одновременно. Некоторые возвращают несколько значений. вызовы sql выполняются многими способами —

5. 1. прямое выполнение запроса строки 2. Выполнение SP как не запрос, 3. Выполнение SP как скалярное. как упоминалось в моем вопросе, проблема в том, что возвращаемые значения 1. строкового запроса select networkId … и 2. хранимой процедуры (упомянутой выше, которые выполняются как скалярные) взаимозаменяемы. эти две процедуры выполняются на одном сервере, но в разных базах данных. 1 возвращает тип int, а 2 возвращает тип string. —- Эта проблема несовместима. Появляется с промежутком в 2-3 дня.

Ответ №1:

«недопустимое исключение приведения» не является ошибкой SQL…

У вас есть другой веб-код, который ожидает разные типы возвращаемых значений для одной и той же хранимой процедуры?

Для SQL невозможно смешивать или изменять разные возвращаемые типы данных, если каждый IIS вызывает один и тот же сервер / базу данных / хранимую процедуру, а хранимая процедура имеет одинаковую исходящую сигнатуру. Единственными причинами могут быть:

  • разные базы данных
  • разные SQL-серверы
  • хранимые процедуры имеют IF SELECT int, varchar... ELSE SELECT varchar, int...
  • динамический SQL

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

1. Спасибо, недопустимое приведение не проходит через SP, я получил это исключение в коде при неявном приведении возвращаемого значения из метода Executescalar. Условных ветвей нет. В конце есть только оператор select @param. Который имеет другой тип для diff SP. но в одном из выполнений я использую следующую строку запроса. Формат(«выберите networkId из acgroup, где groupId ={0}», p_nGroupId); за ним следует object nNetworkId = oSqlFramework. GetScalarData(sql);

2. Тогда возникает ваша ошибка: не используйте один и тот же клиентский код для выдачи одного и того же SQL

3. не могли бы вы рассказать немного больше. Какой клиентский код? выдавать один и тот же SQL?

4. вы имеете в виду oSqlFramework? этот экземпляр создается заново для каждого вызова sql.