Как написать хранимую процедуру для этого? - PullRequest
0 голосов
/ 12 февраля 2010

Я хотел бы создать хранимую процедуру, которая будет принимать строку значений, разделенных запятыми, например «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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 12 февраля 2010

Ознакомьтесь с прекрасной статьей Эрланда Соммарскога о том, как передать список значений в хранимую процедуру в SQL Server 2005:

Массивы и списки в SQL Server 2005 и более поздних версиях

Исходя из этого, вы сможете создать свой запрос на основе ваших критериев.

3 голосов
/ 12 февраля 2010

Смотри здесь http://www.sommarskog.se/arrays-in-sql-2005.html#CSV при условии, что вы хотите сделать это

select somefield from sometable where somefield in(1,2,3,4)
0 голосов
/ 12 февраля 2010

Если вы хотите получить комплекс, вы можете преобразовать входную строку во временную таблицу / переменную таблицы, а затем выполнить серию операторов или запросов 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
0 голосов
/ 12 февраля 2010

Вот очень красивый пример здесь .

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


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

В качестве альтернативы вы можете использовать табличную версию функции split для присоединения к вашему основному запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...