从字符串中取减号( - ),并在不同的程序中使用

时间:2014-12-01 16:18:47

标签: sql sql-server

我有变量

DECLARE @Routs NVARCHAR(1024)
@i int 
SET @Routs = N'6,4,-5,8'

我需要从这个sting中提取任何数字,它前面有减号(示例中为-5) 并使用它作为输入参数,在不同的存储过程中输出out( - ),例如@i。

1 个答案:

答案 0 :(得分:1)

将你的@Routs参数传递给一个表值函数,该函数将列表拆分成一个表,然后循环遍历表,如果值为负数,则执行存储过程或任何你想要的或不做任何事情不是消极的。

- 用逗号分割参数的表函数

ALTER FUNCTION [dbo].[SplitListOfInts] (@list nvarchar(MAX))
RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
DECLARE @pos        int,
       @nextpos    int,
       @valuelen   int

if len(rtrim(@list)) > 0  
begin

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
  end

  RETURN
 END

- 调用split函数并使用@routs参数的存储过程

  CREATE TABLE #values(nbrValue int)
 INSERT INTO #values(nbrValue
 EXEC [dbo].[SplitListOfInts] @routs

- 如果您不关心非负面消息,请在此处删除

 DELETE FROM #values
 where nbrValue >= 0

DECLARE @i int
DECLARE @countrows = (SELECT COUNT(nbrValue) FROM #values)

WHILE @countrows >0
SET @i = (SELECT TOP 1 nbrValue FROM #values)

......做你想做的事

DELETE FROM #values where nbrValue=@i
set @countrows = (SELECT COUNT(nbrValue) FROM #values)
END