在 SQL Server 2008 R2 中执行存储过程的 CR 2016 报告参数问题
Issues with CR 2016 report parameter that executes a stored procedure in SQL Server 2008 R2
快速摘要: Crystal 当我使用 'ALL' 特殊关键字执行我的 SQL SP 时,报告给我错误 "ADO Error Code: 0x80040e14...Incorrect syntax near the keyword 'ALL'."为员工编号。
长话短说:
我有一份用 Crystal Reports 2016 编写的报告,它在执行时收集 3 个参数:
- 开始日期(@fDate - SQL 存储过程/{?FromDate} - CR 命令)
- 截止日期(@tDate - SQL 存储过程/{?ToDate} - CR 命令)
- 员工编号(@eCode - SQL 存储过程/{?EmplNo} - CR
命令)
我们希望报告中的一个功能是能够 运行 为一名员工或所有员工提供。但是,由于这些参数在 Crystal Reports 命令中,我不能将员工编号参数设为可选。从其他一些论坛上,我看到最重要的建议是制作一个 CASE...WHEN 在存储过程端评估参数以确定我是否实际传递了员工编号或者我是否需要所有记录。我使用关键字 "ALL" 来表示我想要 return 所有员工的记录。当我在 MS SSMS 中明确声明和设置参数时,我的存储过程起作用。但是,当我尝试执行完全相同的存储过程时,CR 出错了。是什么导致了这个错误?如何让CR报告我需要的信息?
SAP Crystal Reports Designer 2016 - 未能从数据库检索数据。详情:ADO Error Code: 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 服务器。
你的程序是正确的,所以它不会产生错误,但你的 sp 的 CALL 可以。
这是一个例子:
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;
正在生产
Incorrect syntax near the keyword 'all'.
您可以使用 SQL Server Profiler 查看它。它会显示发送到服务器的内容。
我认为您的 crystal 报告可以在 crystal 报告本身中将 ALL 解释为 smth special,因此它不会作为字符串发送。
你可以用 'everything'
这个词来改变你的 sp 并尝试用它代替 ALL
。
快速摘要: Crystal 当我使用 'ALL' 特殊关键字执行我的 SQL SP 时,报告给我错误 "ADO Error Code: 0x80040e14...Incorrect syntax near the keyword 'ALL'."为员工编号。
长话短说: 我有一份用 Crystal Reports 2016 编写的报告,它在执行时收集 3 个参数:
- 开始日期(@fDate - SQL 存储过程/{?FromDate} - CR 命令)
- 截止日期(@tDate - SQL 存储过程/{?ToDate} - CR 命令)
- 员工编号(@eCode - SQL 存储过程/{?EmplNo} - CR 命令)
我们希望报告中的一个功能是能够 运行 为一名员工或所有员工提供。但是,由于这些参数在 Crystal Reports 命令中,我不能将员工编号参数设为可选。从其他一些论坛上,我看到最重要的建议是制作一个 CASE...WHEN 在存储过程端评估参数以确定我是否实际传递了员工编号或者我是否需要所有记录。我使用关键字 "ALL" 来表示我想要 return 所有员工的记录。当我在 MS SSMS 中明确声明和设置参数时,我的存储过程起作用。但是,当我尝试执行完全相同的存储过程时,CR 出错了。是什么导致了这个错误?如何让CR报告我需要的信息?
SAP Crystal Reports Designer 2016 - 未能从数据库检索数据。详情:ADO Error Code: 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 服务器。
你的程序是正确的,所以它不会产生错误,但你的 sp 的 CALL 可以。
这是一个例子:
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;
正在生产
Incorrect syntax near the keyword 'all'.
您可以使用 SQL Server Profiler 查看它。它会显示发送到服务器的内容。
我认为您的 crystal 报告可以在 crystal 报告本身中将 ALL 解释为 smth special,因此它不会作为字符串发送。
你可以用 'everything'
这个词来改变你的 sp 并尝试用它代替 ALL
。