2014-12-16 1 views
0

Выполняя ту же самую команду sql, я получаю ошибку в зависимости от того, какой порядок параметров определен в хранимой процедуре. Эта ошибка была первоначально обнаружена с использованием сохраненной структуры, обработанной через сущность, но это, по-видимому, не является причиной проблемы.хранимая процедура с запутанными именованными параметрами «Ошибка преобразования типа данных nvarchar в int».

Сообщение об ошибке «Ошибка преобразования типа данных nvarchar в int». похоже, что sproc пытается замять параметр @CagIdList в один из нулевых параметров int. Мысли?

Sql Команда:

exec sp_executesql 
    N'rptAll.usp_SprocParameterTest @StartDate, @EndDate, @CAGIdList', 
    N'@StartDate datetime,@EndDate datetime,@CAGIdList nvarchar(1317)', 
    @StartDate='2014-11-16 00:00:00',@EndDate='2014-12-16 00:00:00',@CAGIdList=N'857,858,859' 

выше команда будет безуспешной с хранимой процедурой:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER procedure [rptAll].[usp_SprocParameterTest] 
(
     @StartDate datetime, 
     @EndDate datetime, 
     @StartRow int = null, -- please note where this parameter started 
     @MaxRows int = null, -- me too 
     @Sort varchar(255)= null, 
     @mfgCode varchar(255) = null, 
     @CAGIdList varchar(max) = null 
) 
as 

select 1 

То же самое будет успешным для этого хранимой процедуры:

--Move the nullable int params to the end of the list 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER procedure [rptAll].[usp_SprocParameterTest] 
(
     @StartDate datetime, 
     @EndDate datetime, 
     @Sort varchar(255)= null, 
     @mfgCode varchar(255) = null, 
     @CAGIdList varchar(5000) = null, 
     @StartRow int = null, --look at mee 
     @MaxRows int = null --hey me too 
) 
as 

select 1 

ответ

2

Это потому, что вызывают процедуру и предоставляют значения для трех первых параметров независимо от их имен. Имена параметров, которые вы используете в запросе, не имеют отношения к именам параметров в процедуре.

Если вы хотите задать значения параметров для конкретных параметров, вы должны назвать их:

rptAll.usp_SprocParameterTest @StartDate = @StartDate, @EndDate = @EndDate, @CAGIdList = @CAGIdList 

Это такая же разница, как вызов процедуры без имен параметров:

rptAll.usp_SprocParameterTest '2014-11-16 00:00:00', '2014-12-16 00:00:00', N'857,858,859' 

и с именами параметров:

rptAll.usp_SprocParameterTest @StartDate = '2014-11-16 00:00:00', @EndDate = '2014-12-16 00:00:00', @CAGIdList = N'857,858,859' 
+0

Спасибо. Я не понял, что мой оригинальный синтаксис был функциональным эквивалентом объявления локальных переменных, а затем передал их по порядку в сохраненный процесс. – Derpy

 Смежные вопросы

  • Нет связанных вопросов^_^