为什么根据使用的功能会得到不同的结果? (SQL Server)

时间:2019-11-15 11:30:37

标签: sql sql-server tsql stored-procedures

我的任务是为公司创建报告。该报告是根据存储过程spGenerateReport返回的结果生成的,该过程具有多个过滤器。

在SP中,这是过滤器的预期工作方式:

SELECT * FROM MyTable WHERE column1 IN (
    'filters', 'for', 'this', 'report'
)

输入上面的代码将在9秒钟内产生约30000行。但是,我希望能够通过传递一个参数来更改SP的过滤器(因为我可能使用1个或2个或n个过滤器),如下所示:

spGenerateReport 'Filters,for,this,report'

为此,我有一个用户创建的函数fnSplitString(是的,我确实知道有一个STRING_SPLIT函数,但是由于我的数据库的兼容性级别较低,我无法使用它)将单个字符串拆分为一个表,就像这样:

SELECT splitData FROM fnSplitString('Filters,for,this,report')

返回:

splitData
------
Filters
for
this
report

因此,我SP中的最终代码是:

SELECT * FROM MyTable WHERE column1 IN (
    SELECT * FROM fnSplitString('Filters,for,this,report')
)

但是,它在60秒内产生了约10000行。完成此SP所需的时间很奇怪,但这并不是什么大问题,但是我几乎四分之一的行消失在空白中肯定是这样。结果仅包含前几个过滤器中的行(例如'Filters''for';如果更改参数的顺序(例如:fnSplitString('report,for,Filters,this')),则会得到不同数量的行,并且仅来自过滤器'report''for''Filters'!我不明白为什么使用该函数返回的结果与使用文字字符串时得到的结果不同。我不知道的?

PS-抱歉,我不善于解释自己以及语法错误

1 个答案:

答案 0 :(得分:1)

使用这两种技术,您肯定会获得相同的结果。出了点问题。

您还没有发布fnSplitString代码,但是我怀疑fnSplitString没有输出列表中的最后一个字符串,或者列表中的最后一个字符串在到达fnSplitString之前被截断了,所以找不到匹配项。

例如如果进入spGenerateReport存储过程的参数是varchar(20),则将到达该函数的是“ Filters,for,this,rep”,最后一位被截断。

例如,

SSRS将截断传递到SP中的字符串,而不是通过错误消息警告您