Как верно DateTime передать в хранимую datetime(Transact-SQL)

Egorich
Дата: 24.01.2010 15:53:02
Добрый день.

Есть хранимая процедура:
ALTER PROCEDURE [dbo].[SoftDocumentHead]
@DocNumber int ,
@DocDate datetime,
@PosCount int

AS
BEGIN
	INSERT INTO Documents (DocNumber, DocDate, PosCount
		)VALUES (@DocNumber, @DocDate, @PosCount);

    -- Возвращаем IDDocuments вставленной записи
	RETURN SCOPE_IDENTITY();
END

Код C# подготовки параметров:
SqlParameter[] paramArray = new SqlParameter[3];

            // Входной параметр 1
            SqlParameter param = new SqlParameter();
            param.ParameterName = "@DocNumber";
            param.SqlDbType = SqlDbType.Int;
            param.Value = checkHead.DocNumber;
            param.Direction = ParameterDirection.Input;
            paramArray[0] = param;

            // Входной параметр 2
            SqlParameter param2 = new SqlParameter();
            param2.ParameterName = "@DocDate";
            param2.SqlDbType = SqlDbType.DateTime;
            param2.Value = DateTime.Now.Date;//checkHead.DocDate;
            param2.Direction = ParameterDirection.Input;
            paramArray[1] = param2;


            // Входной параметр 3
            SqlParameter param3 = new SqlParameter();
            param3.ParameterName = "@PosCount";
            param3.SqlDbType = SqlDbType.Int;
            param3.Value = checkHead.PosCount;
            param3.Direction = ParameterDirection.Input;
            paramArray[2] = param3;

            // Получаем уникальный ИД только что вставленной записи для привязки к шапке строк
            int idDocuments = SqlProcedureCall("SoftDocumentHead", paramArray);

Далее исполнение хранимой:
/// <summary>
        /// Вызов хранимой с параметрами и возвратом параметра int
        /// </summary>
        protected int SqlProcedureCall(string procName, SqlParameter[] paramArray)
        {
            //Установка имени хранимой процедуры
            SqlCommand cmd = new SqlCommand(procName, cn);
            cmd.CommandType = CommandType.StoredProcedure;

            foreach (SqlParameter param in paramArray)
                cmd.Parameters.Add(param);            

            return int.Parse(cmd.ExecuteScalar().ToString());
        }

Профайлером отлавливаю:
автор
exec SoftDocumentHead @DocNumber=45,@DocDate=''2010-01-24 00:00:00:000'',@PosCount=1

Почему оно в дате подставляет 2 раза одинарные кавычки?

Благодарю.
Egorich
Дата: 24.01.2010 17:38:28
Получилось только так:
param2.SqlDbType = SqlDbType.VarChar;
param2.Value = DateTime.Now.Date.ToString("yyyyMMdd hh:mm:ss");
Изопропил
Дата: 25.01.2010 09:23:53
Egorich

Почему оно в дате подставляет 2 раза одинарные кавычки?


Особенности показа в профайлере.
А в следующем посте вы испортили правильный код
МСУ
Дата: 25.01.2010 09:39:30
Egorich
Получилось только так:
param2.SqlDbType = SqlDbType.VarChar;
param2.Value = DateTime.Now.Date.ToString("yyyyMMdd hh:mm:ss");

Не делайте так.
aleks-sam
Дата: 25.01.2010 10:12:16
И еще в вашем случае не обязательно создавать три переменные param, param2, param3. Хватит только param.
Ora Starter
Дата: 25.01.2010 14:00:08
Изопропил,
МСУ

Вы не совсем правы.
Я тоже яркий приверженец параметров, но я недавно узнал вот что. Посмотрите на результаты плана для такого запроса:
use [Test]
GO
if not OBJECT_ID('IndexTable') is null drop table [IndexTable]
GO
create table [IndexTable] (
	[D1] datetime
)
GO
insert into [IndexTable] values('20090101')
GO
insert into [IndexTable] values('20090102')
GO
insert into [IndexTable] values('20090103')
GO
insert into [IndexTable] values('20090104')
GO
create index [IIndexTableD1] on [IndexTable]([D1]) where [D1] >= '20090101'
GO
select * from [IndexTable]
where [D1] >= '20090101'
GO
exec sp_executesql N'select * from [IndexTable] where [D1] >= @P1', N'@P1 datetime', @P1 = '20090101'
GO
И Вы будете прияно а может и нет удевлены! :)
Ora Starter
Дата: 25.01.2010 14:01:12
Да, все это относится к 2008, и возможно к 2005 серверу.
Ken@t
Дата: 25.01.2010 14:25:50
Ora Starter,

нет батенька, это вам нужно внимательно прочитать об особенности выполнения sp_executesql, а так же об оптимазаторе когда, как и почему он строит планы выполнения и передаче параметров хп, функция и батчам.
МСУ
Дата: 25.01.2010 14:27:19
Ken@t
Ora Starter,

нет батенька, это вам нужно внимательно прочитать об особенности выполнения sp_executesql, а так же об оптимазаторе когда, как и почему он строит планы выполнения и передаче параметров хп, функция и батчам.


+1
Ora Starter
Дата: 25.01.2010 14:38:06
Ken@t,

Интересно, покажите пример когда запрос с параметрами с клиента придет без обертки в ХП sp_executesql?