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