快速摘要: Crystal Reports给我错误的错误" ADO错误代码:0x80040E14 ...不正确的语法在关键字'all''附近。当我使用"所有"特殊关键字执行SQL SP时。
长篇小说:我有一份在Crystal Reports 2016中写的报告,该报告在执行时收集3个参数:
- 从日期(@fdate -sql存储过程/{?fromDate} -cr命令)
- 日期(@tdate -sql存储过程/{?todate} -cr命令)
- 员工编号(@ecode -sql存储过程/{?emplno} -cr命令)
我们希望在报告中想要的一个功能是能够为一名员工或所有员工运行它。但是,由于这些参数在Crystal Reports命令中,因此我无法使员工编号参数可选。在其他一些论坛中,我查看了最佳建议是为了提出案例...在评估存储过程端的参数时,以确定我是否实际上是通过员工号码或是否想要所有记录。我使用关键字" all"表示我想返回所有员工的记录。当我明确声明并设置MS SSM中的参数时,我的存储过程有效。但是,当我尝试执行完全相同的存储过程时,CR错误。是什么导致此错误?我如何让CR报告我需要的信息?
SAP Crystal Reports Designer 2016-无法从数据库中检索数据。详细信息:ADO错误代码:0x80040E14
SAP Crystal报告SQL命令:
EXEC AIM.dbo.GetLaborUtil {?FromDate}, {?ToDate}, {?EmplNo}
MS SQL Server 2008 R2(SP2)Express-存储过程代码:
USE [AIM]
GO
/****** Object: StoredProcedure [dbo].[GetLaborUtil] Script Date: 12/12/2017 1:59:38 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetLaborUtil] @fDate date, @tDate date, @eCode varchar(4)
AS
SELECT
*
FROM
AIM.dbo.LaborUtil
WHERE
LaborUtil.AttendDate BETWEEN @fDate AND @tDate
AND
LaborUtil.EmplCode = CASE WHEN @eCode = '' THEN LaborUtil.EmplCode
WHEN @eCode LIKE '%ALL%' THEN LaborUtil.EmplCode
WHEN @eCode IS NULL THEN LaborUtil.EmplCode
ELSE CAST(@eCode AS smallint)
END
ORDER BY
LaborUtil.EmplName,
LaborUtil.AttendDate
手动查询以执行有效的存储过程:
DECLARE @fDate date
DECLARE @tDate date
DECLARE @eCode varchar(4)
SET @fDate = '1900-01-01'
SET @tDate = '2100-12-31'
SET @eCode = 'ALL'
EXEC AIM.dbo.GetLaborUtil @fDate, @tDate, @eCode
我认为您的问题在于如何将参数发送到SQL Server。
您的过程是正确的,因此无法产生错误,但是您的SP呼叫可以。
这是一个示例:
create proc dbo.sp_test_all
@p1 varchar(100), @p2 varchar(100)
as
select @p1 as p1, @p2 as p2;
go
exec dbo.sp_test_all '10', all;
此exec dbo.sp_test_all '10', all;
正在产生
在关键字" all"附近的语法不正确。
您可以使用SQL Server Profiler看到它。它将向您显示发送给服务器的内容。
我认为您的水晶报告可以将所有内容解释为Crystal报告本身中的SMTH特殊,因此它不是作为字符串发送的。
您可以使用 'everything'
单词更改sp,然后尝试它而不是 ALL
。