Rambo_Raja Ответов: 7

как передать параметр datetime при выполнении хранимой процедуры.


моя хранимая процедура выглядит следующим образом:
ALTER procedure [dbo].[spuserdetails]
@Name varchar(50),
@DOB datetime,
@Age int=null,
@Address1 varchar(70),
@phone int,
@Country varchar(50) = null,
@States Varchar(50) = null,
@City varchar(50) = null

As 
Begin
insert into userdetails(Name,DOB,Addr,phn,Country,States,City)
values (@Name,@DOB , @Address1 , @phone , @Country, @States, @City)
end


когда я его исполню :
exec  spuserdetails 'smasher','23-12-1989' ,'516-A wills street',761456,'India','kerala','Tri',1


при выполнении хранимой процедуры возникает следующая ошибка:
Msg 8114, Level 16, State 5, Procedure spuserdetails, Line 0
Error converting data type varchar to datetime.

почему? как передать параметр datetime в таблицу?

7 Ответов

Рейтинг:
58

_Damian S_

Измените свой параметр даты так, чтобы он был "гггг-ММ-ДД", например: "1989-12-23"


Rambo_Raja

"1989-12-23" изменение, как вы сказали, также не работает.та же ошибка.

_Damian S_

Ваш exec sp... имеет параметры в неправильном порядке. Они должны соответствовать порядку, указанному в списке параметров.

Rambo_Raja

спасибо..решена;)

Nabeel SherSoft

та же ошибка

Рейтинг:
1

Member 8362403

вы должны пройти как ММ-ДД-гггг (например:12-01-2010) или гггг-ММ-ДД


CHill60

Лучше всего избегать форматов, специфичных для конкретной страны (например, MM-DD-YYYY было бы неверно для Великобритании). Флешки с ISO 8601 http://www.w3.org/QA/Tips/iso-date[^]

Рейтинг:
1

Member 12431433

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

exec myproc @param=cast(getdate() as float)

процедура myproc
@param float
как
объявить @mydate datetime
выберите @mydate = cast(@param as datetime)


Рейтинг:
0

Radhadeep12

Измените значение даты, как показано ниже

exec  spuserdetails 'smasher','1989-12-23' ,'516-A wills street',761456,'India','kerala','Tri',1


Рейтинг:
0

bangkokrat

Еще один способ, который не включает в себя возню со струнами:

declare @dt as datetime = datetimefromparts(2016,1,25,17,0,0,0)

EXEC	exec  spuserdetails 'smasher', @dt,'516-A wills street',761456,'India','kerala','Tri',1

При вызове ИП из ADO.NET, необходимо указать размер (байты) для параметра даты (например, datetime2(0) = 6, обратитесь к информации MSDN для размеров различных типов дат).


CHill60

Вопрос старше 2 лет и уже ответил на него.
Кроме того, чтобы быть педантичным, "1989-12-23" не будет строкой - это дата-время.
Если вы собираетесь предложить использовать новую встроенную функцию, то стоит упомянуть, что эта функция была введена только в SQL Server 2012 и не работает с Экспресс-версией 2012 года.
Не уверен в уместности говорить об ADO - поскольку SQL Server был помечен, было бы более разумно использовать SqlParameter, я бы использовал datetime2 только в том случае, если вам нужна дополнительная точность, возвращающаяся к 1700-м годам. Я никогда не передавал размер для параметров даты.

Рейтинг:
0

Masud Ahmed

Я не мог передать параметр datetime в хранимую процедуру, где параметр datatime использовался в динамическом sql-запросе, урок, который я выучил:

1. преобразуйте параметр в nvarchar, а не в datetime
2. используйте дополнительные одиночные кавычки до и после преобразования параметра datetime в тип nvarchar
3. Используя описанные выше действия, наша цель-достичь момента, как этот, APPL_ApplicationDate &ЛТ;='27-янв-2015'.

WHERE APPL_ApplicationDate <=  '''+CONVERT(nvarchar, @RefDate)+'''



Решение:
WHERE APPL_ApplicationDate <=  '''+CONVERT(nvarchar, @RefDate)+'''
set @SqlCommand=N'
WITH ctePivotData AS
(
       select CMPN_Company_Name, APPL_Student_Status, STUD_Student_ID       from ng.dbo.STUDstudent
       INNER JOIN ng.dbo.CMPN_Company_main
              ON STUDstudent.STUD_School_ISN=CMPN_Company_main.CMPN_ISN
       INNER JOIN ng.dbo.APPLications
              ON STUDstudent.STUD_Student_ID=APPLications.APPL_Student_ID
       WHERE APPL_ApplicationDate <=  '''+CONVERT(nvarchar, @RefDate)+'''
)
SELECT CMPN_Company_Name,' + @SpreadingList + ' INTO #PivotTable
FROM ctePivotData
PIVOT(count(STUD_Student_ID) FOR APPL_Student_Status IN (' + @SpreadingList + ') ) AS P
order by CMPN_Company_Name;

select * from #PivotTable;';

--print @SqlCommand

execute sp_executesql @SqlCommand;


CHill60

Несколько не по теме для этого вопроса - это ответ на незаданный вопрос "как использовать переменную datetime в динамическом sql" .. а сам вопрос довольно старый и уже решенный.

Рейтинг:
0

Member 14890430

Привет, проблема заключается в типе данных. Вы должны упомянуть его как @date вместо @ datetime. Когда это @datetime, вы должны добавить время вместе с датой. Поэтому при создании процедуры измените тип данных в основном запросе.


Richard MacCutchan

Этот вопрос был решен семь лет назад. Пожалуйста, сосредоточьтесь на текущих открытых вопросах.

CHill60

Неправильный.
Если вы объявите a datetime переменная и только назначьте часть даты, время автоматически устанавливается на полночь. например.

declare @demo datetime = '2020-07-16' 
select @demo
возвращается 2020-07-16 00:00:00.000