1

我想在一个参数中传递多个值。SQL 服务器 2005

4

4 回答 4

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) )

或者

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

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

已编辑:显示您可能需要 CAST - 但是要小心控制在 CSV 列表中发送的内容

于 2012-05-11T20:14:04.253 回答
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
于 2012-05-11T20:59:52.407 回答
0

只是建议。在 SQL Server 2005 中您不能真正做到这一点。至少没有直接的方法。您必须使用 CSV 或 XML 或 Base 64 或 JSON。但是,我强烈不鼓励您这样做,因为它们都容易出错并产生非常大的问题。

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

如果您不能,我建议您考虑在存储过程中执行此操作的必要性,即您是否真的希望(应该/必须)使用 SP 执行 sql 操作。如果您要解决问题,只需使用 Ad hoc 查询。如果您想出于教育目的这样做,您可能会尝试甚至不尝试上述内容。

于 2012-05-08T06:36:28.590 回答
0

有多种方法可以实现这一点,方法是:

  1. 将字符串的CSV 列表作为参数传递给 (N)VARCHAR 参数,然后在您的 SP 中对其进行解析,请查看此处

  2. 首先创建一个XML 字符串,然后将其作为 XML 数据类型参数传递。您将需要解析 SP 中的 XML,您可能需要 APPLY 运算符,请查看此处

  3. 在 SP 外创建一个临时表,将多个值作为多行插入,此处不需要参数。然后在 SP 内部使用临时表,检查这里

  4. 如果您在 2008 年及以上,请尝试TVP(表值参数)并将它们作为参数传递,请查看此处

于 2015-07-10T12:50:48.317 回答