1

У меня есть отчет SQL-сервер, которые имеют STARTDATE и EndDate даты-время параметров, но когда я указать DateTime в них ошибку отчета шоупроблемы преобразования в параметре даты и времени в SQL Server 2008

An error has occurred during report processing. 
Exception has been thrown by the target of an invocation. 
Conversion failed when converting date and/or time from character string. 

StartDate параметр Я имеет значение 6/22/2011 12:00:00 AM при установке в качестве параметра отчета в C# код, мой код хранимой процедуры является

create PROCEDURE Price 
@Startdate datetime = null, 
@Enddate datetime = null  
AS  
declare @sql varchar(8000) 
set @sql = 'SELECT CommodityPrice.dtm_Date FROM Commodity 
INNER JOIN CommodityPrice ON Commodity.int_CommodityId = CommodityPrice.int_CommodityId where Commodity.vcr_HSCode is not null ' 

IF (@Startdate <> '') 
BEGIN 
     SET @sql = @sql + ' and CommodityPrice.dtm_Date >= '+ @Startdate 

END 
IF (@Enddate <> '') 
BEGIN 
     SET @sql = @sql + ' and CommodityPrice.dtm_Date <= '+ @Enddate 
END 

set @sql = @sql+ ' order by CommodityPrice.dtm_Date desc' 

exec (@sql) 

Как я могу удалить эту проблему? Я создаю динамический sql, потому что у меня есть и другие параметры.

ответ

3

Мой совет; не объединяйте входные данные, p (как всегда). Вы все еще можете использовать параметры с EXEC, особенно с sp_ExecuteSQL. Это позволит избежать всех проблем и разрешить повторное использование плана запроса.

НИКОГДА не связывайте пользовательский ввод, даже в TSQL. ВСЕГДА используйте параметры, если это не абсолютно невозможно.

В качестве простейшего примера (в частности, чтобы показать, как имена параметров не должны совпадать):

declare @a int = 15, @b datetime = GETUTCDATE() 

declare @sql nvarchar(400) = 'select @x, @y' 

exec sp_executeSql @sql, N'@x int, @y datetime', @a, @b 

мы передаем в @a и @b в качестве параметров (отображение в @x и @ y) в SQL в @sql и выполняются безопасным, повторно используемым, кэшируемым способом.

1

Вы должны преобразовать значение VARCHAR первого до конкатенации

CONVERT(varchar(30), @Enddate, 121) 

У вас есть вторая проблема в том, что даты и время не может быть пустой строкой: если вы зададите пустую строку, то это становится полночь в 01 Янв 1900 (который равен нулю)

Третья проблема заключается в том, что для динамического SQL вам необходимо предоставить права на таблицы сейчас. Без этого вызывающему абоненту нужны только права на хранимую процедуру.

Наконец, вам не нужно динамический SQL

create PROCEDURE Price 
    @Startdate datetime = null, 
    @Enddate datetime = null  
AS  
SET NOCOUNT ON; 

SET @Startdate = ISNULL(@Startdate, '19000101'); 
SET @Enddate = ISNULL(NULLIF(@Enddate, '19000101'), '99991231'); 

SELECT CommodityPrice.dtm_Date FROM Commodity 
INNER JOIN CommodityPrice ON Commodity.int_CommodityId = CommodityPrice.int_CommodityId where Commodity.vcr_HSCode is not null ' 

and CommodityPrice.dtm_Date >= @Startdate 
and CommodityPrice.dtm_Date <= @Enddate 
order by CommodityPrice.dtm_Date desc 
GO 
+0

Учитывая проблему пустой строки - возможно, было бы лучше передать значение DateTime в качестве строки в отчет. Тогда можно было бы отправить string.Empty. – Gambrinus

+0

@Gambrinus: не очень. Если вы смешиваете строки и даты, вы получите неожиданные ошибки преобразования из-за DMY, MDY и т. Д. – gbn

+0

Im использует динамический SQL, потому что у меня есть 7 других параметров типа int, varchar и bit –

0

Вы можете также оставить "Arround дата-параметр

tableName.DateInTable> @ReportDateParameter 

Вот что работает для меня в проекте.

Извините, вы видели, что ваш sql связан между собой, поэтому ваш DateParameter необходимо преобразовать в строку - как указано выше.

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