Be careful to fn_MVParam
La user-defined function fn_MVParam è arcinota per essere il metodo che rende possibile in Reporting Services il passaggio di parametri multi-values.
Qualche giorno fa ho avuto la felice idea di usare questa function in una stored procedure che non aveva nulla a che fare con Reporting Services.
L'idea era di passare esplicitamente alla SP una stringa contenente parole separate da virgola, con lo scopo di renderle fruibile in modalità rowset, nel caso specifico in una Inner Join.
Dato che la uso da un pezzo nei report, mi sono disinteressato completamente del suo codice T-SQL. Ed è qui che ho commesso un grave errore, perchè stamattina la bella sorpresa in quanto la funzione NON tronca gli spazi a dx e sx.
Così, passando - per esempio - la stringa '4001, 4002, 4003,4004' la mia Inner Join mi restituiva i dati collegati ai soli 4001 e 4004 e NON a 4002 e 4003 che invece erano stati estratti dalla funzione con tanto di spazi a sx.
Ho così modificato la funzione, introducendo un LTRIM( RTRIM(x)) della parola estratta:
create function [util].[fn_MVParam]
(@repparam nvarchar(4000), @delim char(1)= ',')
returns
@values table (param nvarchar(4000))as
begin
declare @chrind int
declare @piece nvarchar(4000)
select @chrind = 1
while @chrind > 0
begin
select @chrind = charindex(@delim,@repparam)
if @chrind > 0
select @piece = left(@repparam,@chrind - 1)
else
select @piece = @repparam
insert @values(param)
values ( LTRIM ( RTRIM (@piece) ) )
select @repparam = right(@repparam,len(@repparam) - @chrind)
if len(@repparam) = 0 break
end
return
end