为什么根据我使用的函数得到不同的结果?(SQL Server)

为什么根据我使用的函数得到不同的结果?(SQL Server),sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我的任务是为我的公司制作一份报告。该报告是根据存储过程spGenerateReport返回的结果生成的,该存储过程具有多个筛选器 在SP内部,这是过滤器的预期工作方式: SELECT * FROM MyTable WHERE column1 IN ( 'filters', 'for', 'this', 'report' ) 输入上述代码可在9秒内生成约30000行。但是,我希望通过向SP传递单个参数(因为我可能使用1个、2个或n个过滤器)来更改SP的过滤器,如下所示: spGenera

我的任务是为我的公司制作一份报告。该报告是根据存储过程spGenerateReport返回的结果生成的,该存储过程具有多个筛选器

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

SELECT * FROM MyTable WHERE column1 IN (
    'filters', 'for', 'this', 'report'
)
输入上述代码可在9秒内生成约30000行。但是,我希望通过向SP传递单个参数(因为我可能使用1个、2个或n个过滤器)来更改SP的过滤器,如下所示:

spGenerateReport'过滤器,用于此报告'

为此,我有一个用户创建的函数fnSplitString(是的,我知道有一个STRING_SPLIT函数,但我不能使用它,因为我的数据库的兼容性级别较低),它将单个字符串拆分为一个表,如下所示:

从fnSplitString中选择splitData('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所需的时间很奇怪,但不是太大的问题,但我的行中有近四分之一消失在空白中肯定是这样。如果我更改参数的顺序(例如:
fnSplitString('report,for,filters,this'),
,则结果仅包含前两个过滤器中的行(例如,
'filters'
'for'
),我得到的行数不同,而且只来自过滤器
'report'
'for'
'filters'
!我不明白为什么使用函数返回的结果与使用文字字符串时得到的结果不同。是否有一些内部技巧我不知道


PS-我事先很抱歉不善于解释我自己,而且对于任何语法错误

你肯定会用这两种方法得到相同的结果。有些地方出了问题

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

e、 g.如果进入spGenerateReport存储过程的参数是varchar(20),那么到达函数的是“Filters,for,this,rep”,最后一位被截断


例如,SSR将截断正在传递到SP的字符串,而不是用错误消息警告您。

也许您应该查看全文索引,而不是执行所有这些字符串操作。
fnSplitString
和/或传递到函数和/或对您传入的参数进行的任何其他操作都会导致字符串被静默截断。您肯定会得到相同的结果。fnSplitString使用者或发出的任何VARCHAR上是否存在最大长度?看起来有什么东西在某处被截断了。我想fnSplitString函数没有输出las列表中的t字符串。发布函数的代码。如果您想使用一个绝对有效的函数,这里有一个适用于SQL2016之前版本的stringsplit函数:如果您正在使用SSR执行多值参数(听起来可能是这样的)以下是所有步骤的指南-事实上,就是这样。在阅读您的答案之前,我注意到:我的SP将VARCHAR(50)作为参数,而我的实际过滤器长度为117个字符。因此,我将其扩展为VARCHAR(500),现在工作正常。事实证明,这实际上是一个我没有意识到的内部噱头(长度较大的参数会被截断,不会抛出任何错误),谢谢你让我意识到这一点。如果运气好的话,我会从中学习,从现在开始更加小心。谢谢!啊,是的,SSRS无声截断确实是一个内部噱头