我想在一个参数中传递多个值。SQL 服务器 2005
问问题
6428 次
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,则可以使用表值参数(Reference1、Reference2)。
如果您不能,我建议您考虑在存储过程中执行此操作的必要性,即您是否真的希望(应该/必须)使用 SP 执行 sql 操作。如果您要解决问题,只需使用 Ad hoc 查询。如果您想出于教育目的这样做,您可能会尝试甚至不尝试上述内容。
于 2012-05-08T06:36:28.590 回答