2014年8月4日 星期一

T-SQL Stored Procedure使用條件式 IN

T-SQL Stored Procedure使用條件式 IN

How to pass string parameter with `IN` operator in stored procedure

(1)T-SQL (sp_ATS_ComparisonPIVOT) 主要預存程序
傳入參數:@model = N'A1234,B1234'
  1. CREATE PROCEDURE [dbo].[sp_ATS_ComparisonPIVOT]
  2. @model nvarchar(max)
  3. AS
  4. declare @ColumnGroup nvarchar(max),
  5. @PivotSQL nvarchar(max)
  6. BEGIN
  7. SET NOCOUNT ON;
  8. select @ColumnGroup = COALESCE(@ColumnGroup + ',' ,'' ) + QUOTENAME(model)
  9. FROM t_ATS_spec
  10. --請看下一行範例
  11. where model in (Select data From dbo.fn_slip_str(@model,','))
  12. GROUP BY QUOTENAME(model)
  13. select @ColumnGroup
  14. SELECT @PivotSQL = N'
  15. SELECT *
  16. FROM (SELECT technicalspecification,name,model,text1 FROM t_ATS_spec) AS SourceTable
  17. PIVOT
  18. (max(text1)
  19. FOR
  20. model IN (' + @ColumnGroup + N')
  21. ) AS PivotTable'
  22. exec(@PivotSQL)
  23.  
  24. END



(2)T-SQL(Function fn_slip_str)搭配字串分割程序使用
  1. Create Function fn_slip_str( @InStr nvarchar(2000) , @s_char nvarchar(1) )
  2. Returns @tb Table ( sno int , data nvarchar(100) )
  3. As
  4. Begin
  5. /*依據傳入字元進行字串分割,回傳Table*/
  6. /*
  7. Declare @InStr nvarchar(2000) , @s_char nvarchar(1);
  8. Set @InStr = '字串一,字串2,字串3,字串4';
  9. Set @s_char = ',';*/
  10.  
  11. Set @InStr = @s_char + @InStr + @s_char;
  12. Declare @p1 Int , @p2 Int , @data nvarchar(100) , @sno int;
  13. Set @p1 = -1 ; Set @p2 = -1 ; Set @data = '' ; Set @sno = 0;
  14. While ( 0 Not In (@P1,@P2) ) Begin
  15. Set @p1 = CharIndex(@s_char,@InStr,@p1+1);
  16. Set @p2 = CharIndex(@s_char,@InStr,@p1+1);
  17. If ( 0 In (@p1,@p2) )
  18. Break;
  19. Set @data = SubString(@InStr,@p1+1,@p2-@p1-1);
  20. if ( @data <> '' ) Begin
  21. Set @sno = @sno +1;
  22. Insert Into @tb ( sno , data ) Values ( @sno , @data )
  23. End
  24. End
  25. Return
  26. End

(3)執行結果:
  1. Select * From dbo.fn_slip_str('字串一,字串2,字串3,字串4',',');

Ref WebSite
http://www.dotblogs.com.tw/rachen/archive/2008/05/23/4110.aspx

沒有留言:

張貼留言