Sql server 2008 执行SQL存储过程时转换日期时间错误
我编写了以下存储过程:Sql server 2008 执行SQL存储过程时转换日期时间错误,sql-server-2008,stored-procedures,datetime-format,Sql Server 2008,Stored Procedures,Datetime Format,我编写了以下存储过程: GO /****** Object: StoredProcedure [dbo].[ReadCounters] Script Date: 08/17/2011 13:43:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ReadCounters -- ALTER PROCEDURE [dbo].[ReadCounters] @type bit, @startDate D
GO
/****** Object: StoredProcedure [dbo].[ReadCounters] Script Date: 08/17/2011 13:43:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- ReadCounters --
ALTER PROCEDURE [dbo].[ReadCounters]
@type bit,
@startDate DateTime,
@endDate DateTime
AS
BEGIN
DECLARE
@AllCounterIds NVARCHAR(MAX),
@Query NVARCHAR(MAX);
SELECT @AllCounterIds = STUFF((
SELECT DISTINCT '],[' + CAST([CounterId] AS VARCHAR(32))
FROM AllCounters
WHERE [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type
for xml path('')), 1, 2, '') + ']';
SET @Query = 'SELECT [DateTime], pvt.* from
(SELECT [Type], [DateTime], [Value], [CounterId]
FROM AllCounters WHERE CounterId IN
(
SELECT DISTINCT([CounterId])
FROM AllCounters
WHERE [DateTime] > '''+ @startDate +''' AND [DateTime] < '''+ @endDate +''' AND [Type] = '+ @type +'
) AND [DateTime] > '''+ @startDate +''' AND [DateTime] < '''+ @endDate +''' AND [Type] = '+ @type +'
) S
PIVOT
(
SUM (Value)
FOR CounterId IN
(' + @AllCounterIds + ')
) AS pvt;';
EXECUTE(@Query);
END
我发现以下错误:
Msg 241, Level 16, State 1, Procedure ReadCounters, Line 19
Conversion failed when converting date and/or time from character string.
任何关于为什么给我错误的建议。如果只执行Select查询,它运行得非常好。您当然需要格式化它
....
WHERE [DateTime] > '''+ CONVERT(varchar(30), @startDate, 120) +''' AND ...
...
为什么SQL server会猜测您想要连接不同的数据类型
错误是因为NVARCHARMAX的优先级低于datetime,根据我宁愿这样做-节省了大量混乱的转换和红/黑中断,尽管我仍然建议将逗号分隔的ID列表连接起来:
SET @Query = N'SELECT [DateTime], pvt.* from
(SELECT [Type], [DateTime], [Value], [CounterId]
FROM AllCounters WHERE CounterId IN
(
SELECT DISTINCT([CounterId])
FROM AllCounters
WHERE [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type
) AND [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type
) S
PIVOT
(
SUM (Value)
FOR CounterId IN
(' + @AllCounterIds + ')
) AS pvt;';
EXEC sp_executesql @query,
N'@startDate DATETIME, @endDate DATETIME, @type BIT',
@startDate, @endDate, @type;
仍然得到相同的错误…检查gbn的答案-这有什么帮助吗?@marc_是的gbn的答案是正确的…谢谢。。。还有一件事,不仅需要转换日期,@type也需要转换-->和[type]='+CAST@typeAS CHAR1+'thanks@dvlpr:是的,出于同样的原因。是的,这在某种程度上是好的。。。但是调用这个SPI时,您必须在代码中一直这样做,我不确定您的意思。这段代码进入存储过程,替换集合并执行您现在拥有的集合。您将能够以完全相同的方式继续调用存储过程。我认为没有必要重复存储过程中的所有其他代码,但如果需要,我可以这样做。
SET @Query = N'SELECT [DateTime], pvt.* from
(SELECT [Type], [DateTime], [Value], [CounterId]
FROM AllCounters WHERE CounterId IN
(
SELECT DISTINCT([CounterId])
FROM AllCounters
WHERE [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type
) AND [DateTime] > @startDate AND [DateTime] < @endDate AND [Type] = @type
) S
PIVOT
(
SUM (Value)
FOR CounterId IN
(' + @AllCounterIds + ')
) AS pvt;';
EXEC sp_executesql @query,
N'@startDate DATETIME, @endDate DATETIME, @type BIT',
@startDate, @endDate, @type;