Agarwal1984 Ответов: 2

Преобразование не удалось при преобразовании даты и/или времени из символьной строки. В SQL server


Привет,

мой запрос получаю ошибку, как это можно устранить:

Я пробовал запускать динамический запрос отдельно, но:-

DECLARE @ContractDurationColumnName NVARCHAR(255)
	Declare @SQL NVARCHAR(2000)

	set @ContractDurationColumnName = (select ColumnName from LCompanySpecificColumns as CSC where CSC.Label='Duration' and CSC.CompanyCode = 'DE' and CSC.TableName = 'LProducts' and CSC.SelecterType = 'Kias-Soc')

	SET @SQL='select LP.ProductCode as ProductId,LP.Name as PRODUCT_DESCRIPTION,PC.Name as PRODUCT_ID_CATEGORY,PS.Name as SOURCE_SYSTEM,' +  @ContractDurationColumnName + ' as ESTIMATED_CONTRACT_DURATION_ID from LProducts as LP 
	inner join RSysCat as SC on LP.SysCatId=SC.Id
	inner join RProductCategories PC on SC.CategoryId=PC.Id
	inner join RProductSystems PS on SC.SystemId=PS.Id
	where LP.CreatedDateTime>= ' +CONVERT(datetime,'2017-11-07 10:33:57.000') + ' and LP.UpdatedDateTime <= ' + CONVERT(datetime,'2018-01-04 10:54:20.510')

	--select @SQL

	exec sp_executesql @SQL


но он также получает ошибку:-

Conversion failed when converting date and/or time from character string. in sql server

Пожалуйста помогите мне заранее спасибо

Анкит Агарвал
инженер-программист

Что я уже пробовал:

Его мой фактический либо процедуры:-

Create proc [dbo].[SpS15ProductMasterData]
@StartDate datetime,
@EndDate datetime
as
begin
	
	DECLARE @ContractDurationColumnName NVARCHAR(255)
	Declare @SQL NVARCHAR(2000)

	set @ContractDurationColumnName = (select ColumnName from LCompanySpecificColumns as CSC where CSC.Label='Duration' and CSC.CompanyCode = 'DE' and CSC.TableName = 'LProducts' and CSC.SelecterType = 'Kias-Soc')

	SET @SQL='select LP.ProductCode as ProductId,LP.Name as PRODUCT_DESCRIPTION,PC.Name as PRODUCT_ID_CATEGORY,PS.Name as SOURCE_SYSTEM,' +  @ContractDurationColumnName + ' as ESTIMATED_CONTRACT_DURATION_ID from LProducts as LP 
	inner join RSysCat as SC on LP.SysCatId=SC.Id
	inner join RProductCategories PC on SC.CategoryId=PC.Id
	inner join RProductSystems PS on SC.SystemId=PS.Id
	where LP.CreatedDateTime>= ' + @StartDate + ' and LP.UpdatedDateTime <= ' + @EndDate

	exec sp_executesql @SQL
end


Exec SpS15ProductMasterData '2017-11-07 10:33:57.000','2018-01-04 10:54:20.510'


Мой код получает ошибку

2 Ответов

Рейтинг:
0

OriginalGriff

Проблема заключается в том, что вы преобразуете строку в DateTime:

...ime>= ' +CONVERT(datetime,'2017-11-07 10:33:57.000') + ' and ...
Который немедленно преобразует его обратно в строку, чтобы его можно было включить в вашу команду.
И вам нужно это сделать, потому что вы динамически решаете, какой столбец возвращать.

Но это ставит строку прямо туда:
...ime>= 2017-11-07 10:33:57.000 and ...
Вам нужно преобразовать дату и время в строку и процитировать ее:
...where LP.CreatedDateTime>= ''' + CONVERT(NVARCHAR, @StartDate, 126) + ''' and LP.UpdatedDateTime <= ''' + CONVERT(NVARCHAR, @EndDate, 126) + ''''...


Richard MacCutchan

Ваше форматирование, кажется, сошло с ума.

OriginalGriff

Это немного помогло ... не знаю, что там произошло. Исправлено.

Рейтинг:
0

Richard Deeming

Избегайте объединения значений в запросы; вместо этого используйте параметры:

SET @SQL='select LP.ProductCode as ProductId, LP.Name as PRODUCT_DESCRIPTION, PC.Name as PRODUCT_ID_CATEGORY, PS.Name as SOURCE_SYSTEM, ' +  @ContractDurationColumnName + ' as ESTIMATED_CONTRACT_DURATION_ID from LProducts as LP 
inner join RSysCat as SC on LP.SysCatId = SC.Id
inner join RProductCategories PC on SC.CategoryId = PC.Id
inner join RProductSystems PS on SC.SystemId = PS.Id
where LP.CreatedDateTime >= @StartDate and LP.UpdatedDateTime <= @EndDate';

exec sp_executesql @SQL,
    N'@StartDate datetime, @EndDate datetime',
    @StartDate = @StartDate,
    @EndDate = @EndDate;

sp_executesql (Transact-SQL) | Microsoft Docs[^]