Selamlar ;
Bir önceki post'umda sizlere dynamic parsingi kullanarak bir string dizisinin split edilip table olarak select sorgu işlemlerinde nasıl kullanılabileceğini göstermiştim.şimdi ise (en azından T-SQL de.) app layer'a bulaşmadan sql tarafında gönderilen sp parameter değerini aynı şekilde split edip ilgili like adedini dinamik olarak kullanmak durumunda kaldım.Yani "222,333,444,555" gibi bir değer için 4 like statement'inin ( field like '%222%' or field like '%333%' or field like '%444%' or field like '%555%' ...) sql'e eklenmesi gerekiyordu.. (http://msdn.microsoft.com/en-us/library/ms179859.aspx linkinde daha detaylı bilgi bulunabilir ama like'in bilinen tüm kullanım şekilleri benim işime cevap olmadığı için bu function'ı yazmak durumunda kaldım.)
USE [EK_12]
GO
/****** Object: UserDefinedFunction [dbo].[fnCommaParserForLike] Script Date: 06/25/2010 11:59:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fnCommaParserForLike] (@search NVARCHAR(2000),@fieldName NVARCHAR(40))
RETURNS NVARCHAR(2000)
BEGIN
declare @retisoc_Desc nvarchar(2000);
set @retisoc_Desc=N'';
declare @breakInt as int;
set @breakInt = 0 ;
declare @isocsX as nvarchar(50);
declare Result CURSOR FOR SELECT * from fnCommaParser(@search)
open Result
FETCH NEXT FROM Result INTO @isocsX
WHILE @@Fetch_Status = 0
BEGIN
if (@breakInt=0)
begin
set @retisoc_Desc = @retisoc_Desc +' '+ @fieldName + ' like ''%'+@isocsX+'%'' ';
end else begin
set @retisoc_Desc = @retisoc_Desc +' or '+ @fieldName + ' like ''%'+@isocsX+'%'' ';
end
set @breakInt = @breakInt + 1;
FETCH NEXT FROM Result INTO @isocsX
END
CLOSE Result
DEALLOCATE Result
return @retisoc_Desc;
END
kullanımı içinde..
declare @locKaynakWeightTotalHammadde as decimal(18,2);
declare @SQLQuery as nvarchar(4000);
declare @likeStatement as nvarchar(2000);
declare @params as nvarchar(2000);
select @likeStatement=N'';
set @likeStatement = (select dbo.fnCommaParserForLike(@glbMotherPo,'FCS_PO'));
set @SQLQuery = N'select @locKaynakWeightTotalHammaddeOUT=(select isnull(sum(FCS_CONSUMED_QTY),0) from dbo.MES_TB_FLD_CONSUMED
inner join MES_TB_FLD_BATCHES on (MES_TB_FLD_BATCHES.FBC_BATCH = MES_TB_FLD_CONSUMED.FCS_BATCH)
where '+@likeStatement+'and FCS_STATUS=N''CNSD'''+
'and FCS_WORKCENTER in (
select WRO_EX_WORKCENTER from dbo.GEN_TB_WRC_OPERATION
where WRO_EX_OPR_TYPE=''SPKAYNAK''))';
set @params = N'@locKaynakWeightTotalHammaddeOUT as decimal(18,2) OUTPUT' ;
EXECUTE sp_executesql @SQLQuery,@params,@locKaynakWeightTotalHammaddeOUT=@locKaynakWeightTotalHammadde OUTPUT
Sevgiler.
E2