2010-02-11 36 views
0

我想创建一个存储过程,发生在像这样的“1,2,3,4”逗号分隔值的字符串,分解并用这些数字来运行在不同的表的查询。如何编写存储过程来执行此操作?

所以在同一个存储过程也将执行类似

select somefield from sometable where somefield = 1 
select somefield from sometable where somefield = 2 
select somefield from sometable where somefield = 3 
select somefield from sometable where somefield = 4 

谢谢!

+0

你google一下,有这么多的答案!!!! – TFD 2010-02-11 21:34:57

回答

5

关于如何在SQL Server 2005中值的列表传递到存储过程中的话题退房厄兰Sommarskog的优秀文章:

Arrays and Lists in SQL Server 2005 and Beyond

从这一点,你应该能够创建查询根据你的标准。

+0

+1详尽报道! – 2010-02-11 21:46:27

+0

这就是我要找的。谢谢! – chobo 2010-02-12 20:01:09

0

有一个非常漂亮的例子here

通过链接中定义的分割功能,您可以执行此操作。


SELECT * 
FROM table 
WHERE id in (SELECT convert(int,Value) FROM dbo.Split(@list_string,',') 

或者,您可以使用表值函数版本的split来加入您的主查询。

0

如果想要变得复杂,可以将输入字符串转换为临时表/表变量,然后在闲暇时执行一系列IF语句或查询。

SQLServer proc以逗号分隔的输入字符串并将其作为表变量返回。

IF EXISTS(SELECT name FROM sysobjects WHERE name = 'fn_parseString' AND (type = 'TF' OR type = 'IF' OR type = 'FN')) 
    DROP FUNCTION fn_parseString 
GO 

/* This function takes a comma delimited string of information and parses it based on commas, returning the resultant strings. */ 

CREATE FUNCTION fn_parseString 
(@StringToParse TEXT) 
RETURNS @StringTable TABLE (ParsedString VARCHAR(8000), StringIndex INT) 
AS 

BEGIN 

DECLARE @CurrentString VARCHAR(8000) 
DECLARE @CurrentStringIndex INT 
DECLARE @TextLength INT 
DECLARE @Index INT 
DECLARE @Letter VARCHAR(1) 
DECLARE @PreviousLetter VARCHAR(1) 

SET @CurrentString = '' 
SET @CurrentStringIndex = 0 
SET @TextLength = DATALENGTH(@StringToParse) 
SET @PreviousLetter = '' 

SET @Index = 1 
WHILE @Index <= @TextLength 
    BEGIN 
    SET @Letter = SUBSTRING(@StringToParse, @Index, 1) 

    IF @Letter = ',' 
     BEGIN 
     SET @CurrentStringIndex = @CurrentStringIndex + 1 

     INSERT INTO @StringTable 
      (ParsedString, 
      StringIndex) 
     VALUES (@CurrentString, 
      @CurrentStringIndex) 

     IF @@ERROR <> 0 
      BEGIN 
      DELETE 
      FROM @StringTable 

      RETURN 
      END 

     SET @CurrentString = '' 
     END 
    ELSE IF @PreviousLetter <> ',' OR (@PreviousLetter = ',' AND @Letter <> ' ') /* Get rid of the spaces inserted when the string was created. */ 
     BEGIN 
     SET @CurrentString = @CurrentString + @Letter 
     END 

    SET @PreviousLetter = @Letter 

    SET @Index = @Index + 1 
    END 

IF @CurrentString <> '' 
    BEGIN 
    SET @CurrentStringIndex = @CurrentStringIndex + 1 

    INSERT INTO @StringTable 
     (ParsedString, 
     StringIndex) 
    VALUES (@CurrentString, 
     @CurrentStringIndex) 

    IF @@ERROR <> 0 
     BEGIN 
     DELETE 
     FROM @StringTable 

     RETURN 
     END 
    END 

RETURN 

END 

代码在其他地方访问功能:

DECLARE @CommaDelimitedString VARCHAR(8000) 
SET @CommaDelimitedString = '1,2,3,4,5,6,7,8,cow,dog,horse' 

DECLARE @StringTable TABLE 
(StringValue VARCHAR(8000), 
ColumnID INT) 

SET NOCOUNT ON 

INSERT INTO @StringTable 
     (StringValue, 
    ColumnID) 
SELECT ParsedString, 
    StringIndex 
FROM dbo.fn_ParseString(@CommaDelimitedString) 

IF @@ERROR <> 0 
    BEGIN 
    SET NOCOUNT OFF 
    RAISERROR('An error occurred while parsing the AccountIDs out of the string.',16,1) 
    END 


SELECT * FROM [Sometable] JOIN @StringTable AS tmp ON [sometable.value] = tmp.StringValue