2014-01-09 3 views
1

Удивительно, нет ли прямого примера для демонстрации использования разделителя в хранимой процедуре?SQL Server Простой пример использования разделителя в хранимой процедуре

У меня есть строковая переменная как вход (с разделителем) и хотелось бы сделать это как условие в Хранимой процедуре. Что-то, как показано ниже:

CREATE PROCEDURE testing 
(
    @stringVar NVARCHAR(255) = NULL 
) 
.... 
BEGIN 

    Select * from table where column not in (@stringVar) 

..... 
END 

значение образца для @stringVar будет a~b~c~d

Как мне справиться с таким случаем? Есть ли встроенная функция разделителя в Sql Server?

ответ

1

это немного сложной ситуации, и нет «Простой способ» делать это. но я могу дать вам самый простой способ сделать это.

Вам нужно будет сделать две вещи, чтобы сделать эту работу,

1) Создать Разделить функцию, которая принимает параметр deliminited строки и разделить эти значения.
2) Сделайте хранимую процедуру в пути, который прошел deliminited строки передается этой функции, а затем расщепляются значения передаются хранимой процедура

Split Функции

CREATE FUNCTION [dbo].[FnSplit] 
(
@List nvarchar(2000), 
@SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table (Id int identity(1,1),Value nvarchar(100)) 
AS 
BEGIN 

    While(Charindex(@SplitOn,@List)>0) 

    Begin 

     Insert Into @RtnValue (value) 
     Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 

    Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List)) 

    End 

    Insert Into @RtnValue (Value) 

    Select Value = ltrim(rtrim(@List)) 

    Return 

END 

Ваших Proc

CREATE PROCEDURE testing 
(
    @stringVar NVARCHAR(255) = NULL 
) 
.... 
BEGIN 

    Select * from table 
    where column not IN(SELECT Value 
         FROM dbo.FnSplit(@stringVar,'~')) 

..... 
END 
0

Нет простого способа этого. Я бы рекомендовал прочитать статью this. Вам нужно разделить вашу строку прогматично. В sql нет такой функции.

0

Есть многие способы реализации разделенных функций в SQL Server с множеством разных характеристик производительности: некоторые (ab) используют XML-функциональность SQL-сервера, некоторые используют таблицы Tally, некоторые используют CLR и т. д. Описание одного из этих методов и сравнение производительности, я бы рекомендовал вам посмотреть статью Джеффа Модена на SQL Server Central (требуется регистрация).

После того, как у вас есть таблица функция сплиттера доступна, вы можете реализовать ваш выбор просто:

select * 
from MyTable t 
where t.MyColumn not in (select Item from dbo.MySplit(@stringVar, '~') where Item is not null) 
; 
1

Существует нет встроенной функции разделителя в Sql Server. Для этой цели вы можете использовать пользовательскую функцию значения таблицы.

Create FUNCTION [dbo].[fnSplitString] 
(@pString varchar(max),@pSplitChar char(1)) 
returns @tblTemp table (tid int,value varchar(1000)) 
as 
begin 

    declare @vStartPosition  int 
    declare @vSplitPosition  int 
    declare @vSplitValue  varchar(1000) 
    declare @vCounter  int 
    set @vCounter=1 

    select @vStartPosition = 1,@vSplitPosition=0 

    set @vSplitPosition = charindex(@pSplitChar , @pString , @vStartPosition) 
    if (@vSplitPosition=0 and len(@pString) != 0) 
    begin 
     INSERT INTO @tblTemp 
      (
      tid  , 
      value 
      ) 
     VALUES 
      (
      1 , 
      @pString   
      ) 
     return  --------------------------------------------------------------->> 
    end 
    set @[email protected][email protected] 
    while (@vSplitPosition > 0) 
    begin 
     set @vSplitValue = substring(@pString , @vStartPosition , @vSplitPosition - @vStartPosition) 
     set @vSplitValue = ltrim(rtrim(@vSplitValue)) 

     INSERT INTO @tblTemp 
      (
      tid  , 
      value 
      ) 
     VALUES 
      (
      @vCounter , 
      @vSplitValue   
      ) 
     set @[email protected]+1 
     set @vStartPosition = @vSplitPosition + 1 
     set @vSplitPosition = charindex(@pSplitChar , @pString , @vStartPosition) 
    end 

    return 
end 
0

Если это просто для проверки существования, то:

Select * from table where CHARINDEX('~'+column+'~' , '~'[email protected]+'~' ,1)=0 
Смежные вопросы