0

我有一个填充报表数据集的存储过程。其中一个参数是可空的 varchar(10),在 sproc def 中默认为 Null。如果用户只想报告单个订单而不是满足其他参数化标准的所有订单,则此参数允许用户指定订单号。

订单号是整数,但它们存储在表中以前导零为前缀的 varchar(10) 字段中。(报告数据是从以这种方式存储整数订单号的 ERP 系统导入的,因此我保持相同的愚蠢格式!)。

当参数设置为 null 时,无论是在 SSMS 中执行存储过程还是在 SSRS 中使用数据集的“查询...”上下文菜单选项时,我都会得到我期望的所有行。

但是,当我在 SSRS 查询设计器表单中指定一个订单号(包含在“单引号”中,因此 SSRS 不会切断前导零)并执行存储过程时,我得到零行返回。然而,当从 SSMS 执行存储过程并将参数设置为相同的值时,我得到了正确的预期行数。

在解析提供给存储过程参数的值时,我感觉 SSRS 在后台做了一些意想不到的事情,所以我的问题是我应该如何指定一个包含整数的字符串,这样我才能在查询设计器中得到与我在SSMS?单引号还是别的?

我没有发布代码,因为我想看看是否有人立即认识到这个问题,而不是离题,“你为什么要这样做,你为什么不这样做?” 最佳实践迷,不能跳出框框思考,输入答案!;-p

但是,也就是说,如果没有人认识到这个问题,我会发布代码。

平台:SQL Server 2008 R2、BIDS 2008。

4

2 回答 2

0

问题是单引号。我将它们放入“定义查询参数”“参数值”窗口。我也在其他两个参数上执行此操作,其中一个在 WHERE 子句中的“LIKE '%parametervalue%”中使用,因此额外的引号不会影响查询结果!

所以....我将以不同的方式处理这个问题,但问题仍然存在,如果你有一个带有前导零的整数的 varchar 字段,如果你不能使用单个值,你如何在 SSRS 中指定一个值引号?

我认为这家伙有同样的问题 定义查询参数视觉工作室

于 2013-03-06T15:34:14.847 回答
0

我也有同样的怀疑,这就是我要求屏幕截图的原因:)

SSRS 知道参数是基于字符串的,因此不需要您添加引号。

假设您的查询参数输入正确,您不需要在任何地方使用引号(字符串在前端不需要任何引号 - 显然在查询中它们需要被引用,否则您将获得隐式转换)。

如果您想处理在后端用前导零填充 int,您可以使用 REPLICATE() 来完成,或者您可以将 int 的字符串表示形式转换为 int。

例如最多有 10 个填充零:

DECLARE @SomeNumericValue int
SET @SomeNumericValue = 10
SELECT RIGHT(REPLICATE('0', 10) + cast(@SomeNumericValue as varchar), 10)

结果:

0000000010

否则你可以逃脱:

SELECT * FROM SomeTable WHERE SomeVarcharFieldWhichActuallyContainsPaddedInts = 10

这是因为 SQL 将隐式0000000010转换为 int - 当然,如果表中表示了非数字值,则这会抛出错误(并且无论结果如何,都会抛出尝试此转换的每个查询,因为 SQL 将转换整个结果集以进行比较)

例如尝试以下脚本:

-- This will work:
DECLARE @SomeTable Table(IntString varchar(50))

insert into @SomeTable
SELECT '000001'
UNION
SELECT '000002'
UNION
SELECT '000003'

SELECT * from @SomeTable where IntString = 1

-- This WILL return some results but it won't be happy...!

insert into @SomeTable
SELECT 'Hello'

SELECT * from @SomeTable where IntString = 1
于 2013-03-06T18:00:01.607 回答