如何在存储过程的单个参数中传递多个值?

时间:2012-05-08 06:19:44

标签: sql-server tsql sql-server-2005

我想在一个参数中传递多个值。 SQL Server 2005

4 个答案:

答案 0 :(得分:1)

可以创建一个函数:

ALTER  FUNCTION [dbo].[CSVStringsToTable_fn] ( @array VARCHAR(8000) )
RETURNS @Table TABLE ( value VARCHAR(100) )
AS 
    BEGIN
        DECLARE @separator_position INTEGER,
            @array_value VARCHAR(8000)  

        SET @array = @array + ','

        WHILE PATINDEX('%,%', @array) <> 0 
            BEGIN
                SELECT  @separator_position = PATINDEX('%,%', @array)
                SELECT  @array_value = LEFT(@array, @separator_position - 1)

                INSERT  @Table
                VALUES  ( @array_value )

                SELECT  @array = STUFF(@array, 1, @separator_position, '')
            END
        RETURN
    END

并从中选择:

DECLARE @LocationList VARCHAR(1000)
SET @LocationList = '1,32'

SELECT  Locations 
FROM    table
WHERE   LocationID IN ( SELECT   CAST(value AS INT)
                           FROM     dbo.CSVStringsToTable_fn(@LocationList) )

OR

SELECT  Locations
FROM    table loc
        INNER JOIN dbo.CSVStringsToTable_fn(@LocationList) list
            ON CAST(list.value AS INT) = loc.LocationID

当您尝试从SSRS向PROC发送多值列表时,这非常有用。

已编辑以显示您可能需要进行CAST - 但请注意控制CSV列表中发送的内容

答案 1 :(得分:1)

你可以让你的sproc采用 xml 类型的输入变量,然后解压缩元素并抓住它们。例如:

DECLARE @XMLData xml

DECLARE 
    @Code varchar(10),
    @Description varchar(10)

SET @XMLData = 
'
    <SomeCollection>
      <SomeItem>
        <Code>ABCD1234</Code>
        <Description>Widget</Description>
      </SomeItem>
    </SomeCollection>
'

SELECT 
    @Code = SomeItems.SomeItem.value('Code[1]', 'varchar(10)'),
    @Description = SomeItems.SomeItem.value('Description[1]', 'varchar(100)')
FROM @XMLDATA.nodes('//SomeItem') SomeItems (SomeItem)

SELECT @Code AS Code, @Description AS Description

结果:

Code        Description
==========  ===========
ABCD1234    Widget

答案 2 :(得分:0)

只是建议。你无法在SQL Server 2005中真正这样做。至少没有一种简单的方法。您必须使用CSV或XML或Base 64或JSON。但是我强烈反对你这样做,因为所有这些都容易出错,并且会产生很大的问题。

如果您能够切换到SQL Server 2008,则可以使用表值参数(Reference1Reference2)。

如果你不能,我建议你考虑在存储过程中执行它的必要性,即你真的想(应该/必须)使用SP执行sql操作。如果您正在解决问题,请使用即席查询。如果你想在教育方面这样做,你可能会尝试甚至不尝试上面提到的事情。

答案 3 :(得分:0)

有多种方法可以实现这一目标:

  1. 将字符串的CSV列表作为参数传递给(N)VARCHAR参数,然后在SP中解析它,check here

  2. 首先创建 XML字符串,然后将其作为XML数据类型param传递。您需要解析SP内部的XML,您可能需要APPLY运算符check here

  3. 在SP外部创建临时表,将多个值插入多行,此处不需要参数。然后在SP内部使用临时表check here

  4. 如果您在2008年及以上,请尝试 TVP(表格值参数)并将其作为参数传递给check here